1. 程式人生 > >P2661 信息傳遞 DFS

P2661 信息傳遞 DFS

main fat == name https () bsp urn class

題目鏈接:洛谷 P2661 信息傳遞

一個人要想知道自己的生日,就意味著信息的傳遞是成環的,因為每輪信息只能傳遞一個人,傳遞的輪數就等於環的大小

環的大小就等於環中的兩個點到第三個點的距離之和加一,我們就可以在使用並查集時,維護每個點到某個確定點的距離

不妨令這個確定點為當前點的祖先,在同一個集合中,所有的點擁有共同的祖先,因此可以確定環的大小

有可能有多個環,最小的環就是最小的輪數

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int f[200005];    
 4 int l[200005];    //到祖先的距離
 5 int
minn = 1<<30; 6 7 int fa(int a){ 8 if(f[a] != a){ 9 int father = f[a]; 10 f[a] = fa(f[a]); 11 l[a] += l[father]; 12 } 13 return f[a]; 14 } 15 16 bool check(int a,int b){ 17 return fa(a) == fa(b); 18 } 19 20 void link(int a,int b){ 21 if(!check(a,b)){
22 f[fa(a)] = fa(b); 23 l[a] = l[b]+1; 24 } 25 else //已經成環 26 minn = min(minn,l[a]+l[b]+1); 27 } 28 29 int main() 30 { 31 int n; 32 cin>>n; 33 for(int i=1;i<=n;++i) 34 f[i] = i; 35 for(int i=1;i<=n;++i){ 36 int ans; 37 cin>>ans;
38 link(i,ans); 39 } 40 cout<<minn; 41 return 0; 42 }

P2661 信息傳遞 DFS