#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
#define int ll
typedef pair<int,int> pi;
typedef vector <int> vi;
typedef vector <pi> vpi;
typedef pair<pi,ll> pii;
typedef set <ll> si;
typedef long double ld;
#define f first
#define s second
#define FOR(i,s,e) for(int i=s;i<=int(e);++i)
#define DEC(i,s,e) for(int i=s;i>=int(e);--i)
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define lbd(x, y) lower_bound(all(x), y)
#define ubd(x, y) upper_bound(all(x), y)
#define aFOR(i,x) for (auto i: x)
#define mem(x,i) memset(x,i,sizeof x)
#define fast ios_base::sync_with_stdio(false),cin.tie(0)
#define maxn 500010
#define INF int(1e18)
#define MOD 1000000007
#define DEBUG 0
typedef pair <int, pi> ipi;
typedef pair <pi,pi> pipi;
int N,M,K;
vi adj[maxn];
int A[maxn], X[maxn];
int dist1[maxn], dist2[maxn], dist3[maxn][2],ans[maxn];
void solve(){
	cin >> N >> M >> K;
	int a,b;
	FOR(i,1,M){
		cin >> a >> b;
		adj[a].pb(b); adj[b].pb(a);
	}
	string S;
	cin >> S;
	FOR(i,1,N) A[i] = (S[i-1] == '1');
	FOR(i,1,K) cin >> X[i];
	
	FOR(i,1,N) if (A[i] > 0){
		aFOR(j, adj[i]) if (A[j] > 0) A[i] = 2;
	}
	mem(dist1,-1); mem(dist2,-1);
	
	// get distances to stop cell
	queue <int> q;
	FOR(i,1,N) if (A[i] > 0){
		q.push(i); dist1[i] = 0;
	}
	while (!q.empty()){
		int cur = q.front(); q.pop();
		aFOR(i, adj[cur]) if (dist1[i] == -1){
			dist1[i] = dist1[cur] + 1;
			q.push(i);
		}
	} 
	
	// get distances to stop cell pairs (dist - turn no)
	priority_queue <pi, vector <pi>, greater <pi> > pq;
	FOR(i,1,N) if (A[i] == 2){
		pq.push(pi(0,i)); dist2[i] = 0;
	}
	while (!pq.empty()){
		pi cur = pq.top(); pq.pop();
		if (dist2[cur.s] != cur.f) continue;
		aFOR(i, adj[cur.s]) if (dist2[i] == -1 || dist2[i] > cur.f + (A[cur.s]==0)){
			dist2[i] = cur.f + (A[cur.s] == 0);
			pq.push(pi(dist2[i], i));
		}
	}
	FOR(i,1,N) ans[i] = INF;
	vi costs; // cost to waste i moves
	FOR(m,0,N){
		int res = 0;
		if (m > 0){
			if (dist1[1] == -1) break;
			FOR(i,2,K){
				int x = X[i];
				int val;
				if (dist1[x] == 0){
					if (dist2[x] == -1) val = 2*m;
					else val = min(2*m, m + dist2[x]);
				}else{
					if (dist2[x] == -1) val = dist1[x] + 2*(m-1);
					else val = min(dist1[x] + 2*(m-1), m + dist2[x]);
				}
				res += val;
			}
		}
		costs.pb(res);
	}
			
	if (K > 300){
		int dist5[N+1]; // min turns to get to each node
		mem(dist5, -1);
		deque <int> dq;
		dist5[X[1]] = 0;
		dq.pb(X[1]);
		while (!dq.empty()){
			int cur = dq.front(); dq.pop_front();
			aFOR(i, adj[cur]){
				int w = (A[cur] > 0 && cur != X[1]);
				if (dist5[i] == -1 || dist5[cur] + w < dist5[i]){
					dist5[i] = dist5[cur] + w;
					if (w == 1) dq.pb(i);
					else dq.push_front(i);
				}	
			}	
		}
		//~ FOR(i,1,N) cout << dist5[i] << ' ';
		//~ cout << '\n';
		ans[X[1]] = 0;
		int Y = N/(K-1)+1;
		int dist4[N+1][Y+1];
		FOR(i,1,N) FOR(j,0,Y) dist4[i][j] = -1;
		dist4[X[1]][0] = 0;
		queue <pi> q2; q2.push(pi(X[1], 0));
		while (!q2.empty()){
			pi cur = q2.front(); q2.pop();
			aFOR(i, adj[cur.f]){
				pi n = pi(i, cur.s + (cur.f != X[1] && A[cur.f] > 0));
				if (n.s - dist5[i] > Y) continue;
				if (dist4[n.f][n.s-dist5[i]] == -1){
					dist4[n.f][n.s-dist5[i]] = dist4[cur.f][cur.s-dist5[cur.f]] + 1;
					q2.push(n);
				}
			}
		}
		FOR(m,0,Y){
			FOR(i,1,N) if (dist4[i][m] != -1){
				ans[i] = min(ans[i], costs[m+dist5[i]] + dist4[i][m]);
			}
		}
	}else{
		
		queue <int> q;
		q.push(X[1]); ans[X[1]] = 0;
		while (!q.empty()){
			int cur = q.front(); q.pop();
			aFOR(i, adj[cur]) if (ans[i] == INF){
				ans[i] = ans[cur] + 1;
				if (A[i] == 0) q.push(i);
			}
		}
		FOR(i,1,costs.size()-2){
			if (i > 1 && costs[i] - costs[i-1] == costs[i+1] - costs[i]) continue;
			int g = costs[i+1] - costs[i];
			priority_queue <ipi, vector <ipi>, greater <ipi> > pq;
			pq.push(ipi(0,pi(X[1],0)));
			mem(dist3, -1);
			dist3[X[1]][0] = 0;
			while (!pq.empty()){
				ipi cur = pq.top(); pq.pop();
				if (dist3[cur.s.f][cur.s.s] != cur.f) continue;
				int c = (A[cur.s.f] > 0 && cur.s.f != X[1] ? g + 1 : 1);
				int j = cur.s.s||(cur.s.f != X[1] && A[cur.s.f]>0);
				aFOR(u, adj[cur.s.f]) if (dist3[u][j] == -1 || dist3[u][j] > cur.f + c){
					dist3[u][j] = cur.f + c;
					pq.push(ipi(dist3[u][j], pi(u,j)));
				}
			}
			FOR(j,1,N) if (dist3[j][1] != -1){
				ans[j] = min(ans[j], dist3[j][1] + costs[i] - i*g);
			}
		}
	}
	//~ cout << '\n';
	FOR(i,1,N){
		//~ assert(ans[i] < INF);
		//~ assert(ans[i] >= 0);
		cout << ans[i] << '\n';
	}
}
	
	
int32_t main(){
	fast;
	solve();
}
	
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |