#include<bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
const int maxn=5e4+5;
vector<int> graf[maxn];
ll N,M,K,poz[maxn],res[maxn],dist[maxn],d1[maxn],d2[maxn],cena[maxn],propval[maxn];
bool nexttostop[maxn];
const int barem=20;
int prosli[maxn],pvred;
string stop;
priority_queue<pair<ll,ll>> PQ;
queue<pair<int,int>> Q;
void input(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cin>>N>>M>>K;
while(M--){
int a,b;
cin>>a>>b;
graf[a].push_back(b);
graf[b].push_back(a);
}
cin>>stop;
stop="0"+stop+"0000";
for(int i=0;i<stop.size();i++)
stop[i]-='0';
for(int i=1;i<=K;i++)
cin>>poz[i];
// cout<<"UNEO INPUT"<<endl;
}
void BFS(){
pvred++;
for(int i=1;i<=N;i++)
dist[i]=1e18;
while(Q.size()){
auto x=Q.front();
Q.pop();
int tren=x.first;
int d=x.second;
// cout<<tren<<" "<<d<<endl;
if(prosli[tren]==pvred)
continue;
prosli[tren]=pvred;
dist[tren]=d;
for(int y:graf[tren])
Q.push({y,d+1});
}
}
void solve1(){
int poc=poz[1];
Q.push({poc,0});
BFS();
for(int i=1;i<=N;i++)
cout<<dist[i]<<"\n";
}
void calcdist(){
for(int i=1;i<=N;i++){
nexttostop[i]=false;
for(int x:graf[i])
nexttostop[i]|=stop[x];
}
for(int i=1;i<=N;i++)
if(stop[i])
Q.push({i,0});
BFS();
for(int i=1;i<=N;i++)
d1[i]=dist[i];
for(int i=1;i<=N;i++){
if(d1[i]==0){
if(nexttostop[i])
d1[i]=1;
else
d1[i]=2;
}
}/*
for(int i=1;i<=N;i++)
cout<<d1[i]<<" ";
cout<<endl;*/
//cout<<"OVDE"<<endl;
for(int i=1;i<=N;i++)
d2[i]=1e18;
for(int i=1;i<=N;i++)
if(nexttostop[i] and stop[i])
PQ.push({-1,i});
pvred++;
while(PQ.size()){
auto aa=PQ.top();
PQ.pop();
int tren=aa.second;
int d=-aa.first;
if(prosli[tren]==pvred)
continue;
prosli[tren]=pvred;
d2[tren]=d;
for(int x:graf[tren])
PQ.push({-(d+1-stop[tren]),x});
}
}
void calcchange(){
for(int i=2;i<=K;i++){
int x=poz[i];
for(int i=1;i<=barem;i++)
cena[i]+=min(d1[x]+2*(i-1),d2[x]+(i-1));
}
for(int i=barem;i>=2;i--)
cena[i]-=cena[i-1];
}
void Dijkstra(){
pvred++;
while(PQ.size()){
auto aa=PQ.top();
PQ.pop();
int tren=aa.second;
ll d=-aa.first;
if(prosli[tren]==pvred)
continue;
// cout<<tren<<" "<<d<<endl;
prosli[tren]=pvred;
dist[tren]=min(dist[tren],d);
if(stop[tren] and propval[tren]!=d)
continue;
for(int x:graf[tren])
PQ.push({-(d+1),x});
}
}
signed main(){
input();
bool hasstop=false;
for(int i=1;i<=N;i++)
if(stop[i])
hasstop=true;
if(hasstop==false){
solve1();
return 0;
}
calcdist();
//cout<<"AAA"<<endl;
calcchange();
//cout<<"BB"<<endl;
/* cout<<"CENE"<<endl;
for(int i=1;i<=N;i++)
cout<<cena[i]<<" ";
cout<<endl;
*/
for(int i=1;i<=N;i++)
dist[i]=res[i]=1e18;
int poc=poz[1];
//dist[poc]=res[poc]=0;
for(int i=1;i<=N;i++)
propval[i]=-1;
propval[poc]=0;
PQ.push({0,poc});
Dijkstra();
/* for(int i=1;i<=N;i++)
cout<<dist[i]<<" ";
cout<<endl;
*/
for(int i=1;i<=N;i++)
res[i]=min(dist[i],res[i]);
bool change;
for(int it=1;it<=barem;it++){
for(int i=1;i<=N;i++)
propval[i]=-1;
for(int i=1;i<=N;i++)
if(stop[i] and dist[i]<1e17){
ll d=dist[i]+cena[it];
PQ.push({-d,i});
propval[i]=d;
}
for(int i=1;i<=N;i++)
dist[i]=1e18;
Dijkstra();
change=false;
for(int i=1;i<=N;i++)
if(dist[i]<res[i]){
res[i]=dist[i];
change=true;
}
if(change==false)
break;
}
if(change)
return -1;
for(int i=1;i<=N;i++)
cout<<res[i]<<"\n";
return 0;
}
/*
3 2 3
1 2
2 3
010
1 3 3
7 7 3
1 6
2 6
2 3
3 4
4 5
5 6
6 7
1110101
1 3 5
15 15 2
1 2
1 10
2 3
3 4
4 5
5 6
6 7
7 8
7 10
8 9
10 11
11 12
12 13
13 14
14 15
000000111100000
1 15
*/
Compilation message
Main.cpp: In function 'void input()':
Main.cpp:26:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
26 | for(int i=0;i<stop.size();i++)
| ~^~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
4696 KB |
Output is correct |
2 |
Correct |
11 ms |
5976 KB |
Output is correct |
3 |
Correct |
17 ms |
7004 KB |
Output is correct |
4 |
Correct |
15 ms |
6912 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
4700 KB |
Output is correct |
2 |
Correct |
31 ms |
6032 KB |
Output is correct |
3 |
Correct |
34 ms |
7088 KB |
Output is correct |
4 |
Correct |
24 ms |
6996 KB |
Output is correct |
5 |
Correct |
48 ms |
6840 KB |
Output is correct |
6 |
Correct |
45 ms |
6744 KB |
Output is correct |
7 |
Correct |
25 ms |
6720 KB |
Output is correct |
8 |
Correct |
28 ms |
6792 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4696 KB |
Output is correct |
2 |
Correct |
30 ms |
5980 KB |
Output is correct |
3 |
Correct |
48 ms |
6828 KB |
Output is correct |
4 |
Correct |
26 ms |
6996 KB |
Output is correct |
5 |
Correct |
35 ms |
7088 KB |
Output is correct |
6 |
Correct |
34 ms |
6996 KB |
Output is correct |
7 |
Correct |
46 ms |
6748 KB |
Output is correct |
8 |
Correct |
31 ms |
7084 KB |
Output is correct |
9 |
Correct |
35 ms |
8244 KB |
Output is correct |
10 |
Correct |
39 ms |
8112 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
4700 KB |
Output is correct |
2 |
Correct |
7 ms |
4700 KB |
Output is correct |
3 |
Correct |
3 ms |
4796 KB |
Output is correct |
4 |
Incorrect |
9 ms |
4696 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
44 ms |
6748 KB |
Output is correct |
2 |
Runtime error |
31 ms |
7004 KB |
Execution failed because the return code was nonzero |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
44 ms |
6748 KB |
Output is correct |
2 |
Runtime error |
31 ms |
7004 KB |
Execution failed because the return code was nonzero |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
4700 KB |
Output is correct |
2 |
Correct |
7 ms |
4700 KB |
Output is correct |
3 |
Correct |
3 ms |
4796 KB |
Output is correct |
4 |
Incorrect |
9 ms |
4696 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
4696 KB |
Output is correct |
2 |
Correct |
11 ms |
5976 KB |
Output is correct |
3 |
Correct |
17 ms |
7004 KB |
Output is correct |
4 |
Correct |
15 ms |
6912 KB |
Output is correct |
5 |
Correct |
5 ms |
4700 KB |
Output is correct |
6 |
Correct |
31 ms |
6032 KB |
Output is correct |
7 |
Correct |
34 ms |
7088 KB |
Output is correct |
8 |
Correct |
24 ms |
6996 KB |
Output is correct |
9 |
Correct |
48 ms |
6840 KB |
Output is correct |
10 |
Correct |
45 ms |
6744 KB |
Output is correct |
11 |
Correct |
25 ms |
6720 KB |
Output is correct |
12 |
Correct |
28 ms |
6792 KB |
Output is correct |
13 |
Correct |
3 ms |
4696 KB |
Output is correct |
14 |
Correct |
30 ms |
5980 KB |
Output is correct |
15 |
Correct |
48 ms |
6828 KB |
Output is correct |
16 |
Correct |
26 ms |
6996 KB |
Output is correct |
17 |
Correct |
35 ms |
7088 KB |
Output is correct |
18 |
Correct |
34 ms |
6996 KB |
Output is correct |
19 |
Correct |
46 ms |
6748 KB |
Output is correct |
20 |
Correct |
31 ms |
7084 KB |
Output is correct |
21 |
Correct |
35 ms |
8244 KB |
Output is correct |
22 |
Correct |
39 ms |
8112 KB |
Output is correct |
23 |
Correct |
2 ms |
4700 KB |
Output is correct |
24 |
Correct |
7 ms |
4700 KB |
Output is correct |
25 |
Correct |
3 ms |
4796 KB |
Output is correct |
26 |
Incorrect |
9 ms |
4696 KB |
Output isn't correct |
27 |
Halted |
0 ms |
0 KB |
- |