#include <bits/stdc++.h>
#define x first
#define y second
#define int long long
using namespace std;
using pii = pair<int,int>;
vector<int>v[50005];
int c[50005],type[50005],distfrom1[50005],distfrom2[50005],from[50005],ans[50005],inq[50005];
pii dist[50005];
bool chk[50005];
struct p{
int idx,cnt,val,jump;
bool operator<(const p &b)const{
if(val==b.val)return cnt>b.cnt;
return val>b.val;
}
};
struct pp{
int idx,from,val;
};
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
int n,m,k,x,y,s;
string str;
cin>>n>>m>>k;
for(int i = 0; i < m; i++){
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
cin>>str>>s;
str="0"+str;
for(int i = 1; i <= n; i++){
if(str[i]=='1'){
bool f=0;
for(int &nx:v[i]){
if(str[nx]=='1'){
f=1;
break;
}
}
if(f)type[i]=2;
else type[i]=1;
}
}
queue<pp>qq;
for(int i = 1; i <= n; i++){
if(type[i]==1){
chk[i]=1;
qq.push({i,i,0});
}
}
if(qq.empty()){
memset(distfrom1,0x3f,sizeof(distfrom1));
}
while(!qq.empty()){
pp now=qq.front();qq.pop();
distfrom1[now.idx]=now.val;
for(int &nx:v[now.idx]){
if(!chk[nx]){
chk[nx]=1;
from[nx]=now.from;
qq.push({nx,now.from,now.val+1});
}
}
}
queue<int>q;
memset(distfrom2,0x3f,sizeof(distfrom2));
for(int i = 1; i <= n; i++){
if(type[i]==2){
inq[i]=1;
q.push(i);
distfrom2[i]=0;
}
}
while(!q.empty()){
int now=q.front();q.pop();
inq[now]=0;
for(int &nx:v[now]){
if(distfrom2[nx]>distfrom2[now]+(type[now]==1?0:1)){
distfrom2[nx]=distfrom2[now]+(type[now]==1?0:1);
if(!inq[nx]){
inq[nx]=1;
q.push(nx);
}
}
}
}
for(int i = 1; i < k; i++){
cin>>x;
if(distfrom2[x]>=1e9){
if(!type[x]){
c[1]+=distfrom1[x];
c[2]+=-distfrom1[x]+2;
}
else{
c[1]+=2;
}
continue;
}
if(distfrom1[x]>=1e9){
if(!type[x]){
c[1]+=distfrom2[x];
c[2]+=-distfrom2[x]+1;
}
else{
c[1]+=1;
}
continue;
}
if(!type[x]){
if(distfrom1[x]>=distfrom2[x]){
c[1]+=distfrom2[x];
c[2]+=-distfrom2[x]+1;
}
else{
int bv=distfrom2[x];
c[1]+=distfrom1[x];
c[2]+=-distfrom1[x]+2;
c[min(n+1,2+bv-distfrom1[x])]+=-1;
}
}
else if(type[x]==1){
c[1]+=2;
c[distfrom2[x]]+=-1;
}
else{
c[1]+=1;
}
}
int add=0;
for(int i = 1; i <= n; i++){
add+=c[i];
c[i]=add;
dist[i]={1e18,1e18};
ans[i]=1e18;
}
//for(int i = 1; i <= n; i++)cerr<<distfrom1[i]<<' ';
//cerr<<'\n';
//for(int i = 1; i <= n; i++)cerr<<distfrom2[i]<<' ';
//cerr<<'\n';
//for(int i = 1; i <= n; i++)cerr<<c[i]<<' ';
priority_queue<p>pq;
pq.push({s,0,0,0});
while(!pq.empty()){
p cur=pq.top();pq.pop();
if(pii{cur.val,cur.cnt}>=pii{dist[cur.idx].x,dist[cur.idx].y})continue;
dist[cur.idx]={cur.cnt,cur.val};
ans[cur.idx]=min(ans[cur.idx],cur.val);
if(cur.jump)cur.val+=c[cur.cnt];
for(int &nx:v[cur.idx]){
if(type[nx]){
pq.push({nx,cur.cnt+1,cur.val+1,1});
}
else{
pq.push({nx,cur.cnt,cur.val+1,0});
}
}
}
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... |