洛谷 P2661信息傳遞

圖論——>並查集 P2661ios

本蒟蒻啥也不會 這題還WA了1次 =  = 最後看題解A 哭了spa

看題是多個(N<=200000)東西之間的關係維護 果斷想到並查集code

在第i個位置的a[i] 表示i告訴a[i]blog

那麼從i向a[i]連邊 同時要維護點和點之間的距離(注意順序 不要瞎連=  =) ci

代碼表示就是get

int a=find(i) ,b=find(a[i]);it

fa[a]=b,dis[i]=dis[a[i]]+1;io

關於find怎麼寫?ast

int find (int a){class

if(a==fa[a]) return fa[a];

int root =fa[a];

fa[a]=find [fa[a]];//之所要先find是爲了保證root的dis值正確

dis[a]+=dis[root];

return fa[a];     }

關鍵就是這樣了 剩下的本身理一理想一想思路吧

#include<iostream> #include<cstdio> #include<cmath> #include<algorithm>
#define N 200010
using namespace std; int n; int fa[N],dis[N]; int find(int x) { if(fa[x]==x) return x; else { int last=fa[x];//make dis[fa[x]] right
        fa[x]=find(fa[x]); dis[x]+=dis[last]; return fa[x]; } } int main() { //reopen("testdata(5).in","r",stdin);
    int ans=0x7fffffff; cin>>n; for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=n;i++) { int tra1; scanf("%d",&tra1); int fa1=find(i),fa2=find(tra1); if(fa1==fa2)//ring found
 { ans=min(ans,dis[tra1]+dis[i]+1); } else { fa[fa1]=fa2; dis[i]=dis[tra1]+1; } } cout<<ans; return 0; }

嗯哼~

TAG:SIN_XIII ⑨

相關文章
相關標籤/搜索