#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define dbg for(int i=1;i<=n;i++)cerr<<ans[i]<<' ';cerr<<'\n';
using pii=pair<int,int>;
const int lim=5e4+100;
vector<int>v[lim];
int stop[lim];
int fakedist[lim];
int baddist[lim],gooddist[lim];
int dist[lim],ans[lim];
int main(){
  int n,m,k;
  cin>>n>>m>>k;
  for(int i=0;i<m;i++){
    int x,y;
    cin>>x>>y;
    v[x].pb(y);
    v[y].pb(x);
  }
  string s;
  cin>>s;
  for(int i=0;i<n;i++)stop[i+1]=s[i]-'0';
  deque<int>q;
  for(int i=1;i<=n;i++){
    fakedist[i]=INT_MAX;
    if(stop[i]){
      fakedist[i]=0;
      q.pb(i);
    }
  }
  while(q.size()){
    int node=q.front();
    q.pop_front();
    for(int j:v[node]){
      if(fakedist[j]==INT_MAX){
        fakedist[j]=fakedist[node]+1;
        q.pb(j);
      }
    }
  }
  for(int i=1;i<=n;i++){
    baddist[i]=INT_MAX;
    for(int j:v[i]){
      if(fakedist[j]!=INT_MAX){
        baddist[i]=min(baddist[i],fakedist[j]+1);
      }
    }
  }
  for(int i=1;i<=n;i++){
    fakedist[i]=INT_MAX;
    if(!stop[i])continue;
    for(int j:v[i]){
      if(stop[j]){
        fakedist[i]=0;
        q.pb(i);
        break;
      }
    }
  }
  while(q.size()){
    int node=q.front();
    q.pop_front();
    for(int j:v[node]){
      if(fakedist[j]==INT_MAX){
        if(stop[j]){
          fakedist[j]=fakedist[node];
          q.push_front(j);
        }else{
          fakedist[j]=fakedist[node]+1;
          q.pb(j);
        }
      }
    }
  }
  for(int i=1;i<=n;i++){
    gooddist[i]=INT_MAX;
    for(int j:v[i]){
      if(fakedist[j]!=INT_MAX){
        gooddist[i]=min(gooddist[i],fakedist[j]+1);
      }
    }
  }
  int a[k];
  for(int i=0;i<k;i++){
    cin>>a[i];
  }
  for(int i=1;i<=n;i++)dist[i]=ans[i]=INT_MAX;
  dist[a[0]]=ans[a[0]]=0;
  q.pb(a[0]);
  vector<int>changed;
  while(q.size()){
    int node=q.front();
    q.pop_front();
    for(int j:v[node]){
      if(dist[j]==INT_MAX){
        dist[j]=dist[node]+1;
        ans[j]=dist[j];
        if(stop[j]){
          changed.pb(j);
        }else{
          q.pb(j);
        }
      }
    }
  }
  if(!changed.size()){
    for(int i=1;i<=n;i++)cout<<ans[i]<<'\n';
    return 0;
  }
  int torem[n+1]{};
  int base=0,inc=0;
  for(int i=1;i<k;i++){
    base+=baddist[a[i]];
    inc+=2;
    if(gooddist[a[i]]!=INT_MAX)torem[gooddist[a[i]]-baddist[a[i]]]++;
  }
  for(int i=0;i<n;i++){
    priority_queue<pii,vector<pii>,greater<pii>>pq;
    for(int j:changed)pq.push({dist[j],j});
    changed.clear();
    while(pq.size()){
      auto[ds,node]=pq.top();
      pq.pop();
      if(ds!=dist[node])continue;
      for(int j:v[node]){
        if(ds+1<dist[j]){
          dist[j]=ds+1;
          ans[j]=min(ans[j],dist[j]+base);
          if(stop[j]){
            changed.pb(j);
          }else{
            pq.push({dist[j],j});
          }
        }
      }
    }
    inc-=torem[i];
    base+=inc;
  }
  for(int i=1;i<=n;i++){
    cout<<ans[i]<<'\n';
  }
}
| # | 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... |