CodeForces Round 693 G
連結:
https://codeforces.ml/problemset/problem/1472/G
題目大意:
有T(1
≤
\leq
≤
T
T
T
≤
\leq
≤
1
0
4
10^4
104)組資料,給定一張
n
n
n(2
≤
\leq
≤
n
n
n
≤
\leq
≤
2
∗
1
0
5
2*10^5
2∗105)個點,
m
m
m(1
≤
\leq
≤
m
m
m
≤
\leq
≤
2
∗
1
0
5
2*10^5
2∗105)條邊的有向圖.定義
1
1
1號點為首都,每個點到
1
1
1號點都有一個距離
d
i
d_i
分析:
考慮
f
i
f_i
fi
#include<bits/stdc++.h>
#define MAXN 200005
using namespace std;
int n, m,mx,d[MAXN],Cnt,Head[MAXN],f[MAXN];
bool Vis[MAXN];
struct Edge{
int v,nxt;
}edge[MAXN];
queue<int>Q;
vector<int>Pot[MAXN];
void Addedge(int u,int v){
++Cnt;edge[Cnt].v=v;
edge[Cnt].nxt=Head[u];Head[u]=Cnt;
}
void Bfs(int Node){
while(!Q.empty())Q.pop();
Q.push(Node);
while(!Q.empty()){
int Node=Q.front();
Q.pop();
for(int i=Head[Node];i;i=edge[i].nxt){
if(!Vis[edge[i].v]){
Vis[edge[i].v]=1;
d[edge[i].v]=d[Node]+1;
Pot[d[edge[i].v]].clear();
mx=max(d[Node]+1,mx);
Q.push(edge[i].v);
}
}
}
for(int i=1;i<=n;++i)
Pot[d[i]].push_back(i),f[i]=d[i];
}
int main(){
int Tmp;
cin>>Tmp;
while(Tmp--){
cin>>n>>m;
mx=0;
for(int i=1;i<=n;++i)Vis[i]=Head[i]=0;
Cnt=0;
for(int i=1;i<=m;++i){
int u,v;
cin>>u>>v;
Addedge(u,v);
}
Vis[1]=1;
Bfs(1);
for(int i=mx;i>=1;--i){
if(Pot[i].size()==0)continue;
int Sz=Pot[i].size();
for(int j=0;j<Sz;++j){
for(int k=Head[Pot[i][j]];k;k=edge[k].nxt){
if(d[Pot[i][j]]<d[edge[k].v]){
f[Pot[i][j]]=min(f[Pot[i][j]],f[edge[k].v]);
}
else{
f[Pot[i][j]]=min(f[Pot[i][j]],d[edge[k].v]);
}
}
}
}
for(int i=1;i<=n;++i)
cout<<f[i]<<" ";
puts("");
}
return 0;
}
時間複雜度O( ∑ i = 1 T ( M i + N i ) \displaystyle\sum_{i=1}^T (M_i+N_i) i=1∑T(Mi+Ni))