1. 程式人生 > 其它 >CodeForces Round 693 G

CodeForces Round 693 G

技術標籤:Acm 圖論Acm 思維Acm 動態規劃

連結:
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 2105)個點, m m m(1 ≤ \leq m m m ≤ \leq 2 ∗ 1 0 5 2*10^5 2105)條邊的有向圖.定義 1 1 1號點為首都,每個點到 1 1 1號點都有一個距離 d i d_i

di,在每條邊 ( u , v ) (u,v) (u,v)上,如果 d u < d v d_u<d_v du<dv,則可以用無限次;如果 d u d_u du ≥ \geq d v d_v dv,則可以至多用一次.求每個點到1的最短距離.(注: ∑ i = 1 T N i , ∑ i = 1 T M i \displaystyle\sum_{i=1}^T N_i,\displaystyle\sum_{i=1}^T M_i i=1TNi,i=1TMi ≤ \leq 2 ∗ 1 0 5 2*10^5 2105)
分析:
考慮 f i f_i fi
表示最終答案, d i d_i di按從大到小排序, d u < d v , f u = m i n ( f u , f v ) d_u<d_v,f_u=min(f_u,f_v) du<dv,fu=min(fu,fv), d u d_u du ≥ \geq d v , f u = m i n ( f u , d v ) d_v,f_u=min(f_u,d_v) dv,fu=min(fu,dv).

#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=1T(Mi+Ni))