标签:des style blog http color io os ar for
看题目就知道这是NOI2002的Galaxy——银河英雄传说
题目如下:
1 int find(int x) 2 { 3 int t; 4 if(fa[x]==x)return x; 5 t=fa[x]; 6 fa[x]=find(fa[x]); 7 dis[x]+=dis[t]; 8 return fa[x]; 9 }
不难看到,在递归的过程中,我们看到了dis的更新,每次先用t记录下路径压缩前的父亲。然后我们递归操作t也就是当前的父亲,计算好t之后,我们把dis[x]+=dis[t],这样就实现了一层层计算上来。
最后,我们只需要返回其路径压缩后父亲的值。就这么简单,不是么?我这只蒟蒻还学了好长时间,╮(╯▽╰)╭。。。。真是对自己的智商表示无语啊。
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 int T; 7 int fa[30050],last[30050],dis[30050]; 8 int find(int x) 9 { 10 int t; 11 if(fa[x]==x)return x; 12 t=fa[x]; 13 fa[x]=find(fa[x]); 14 dis[x]+=dis[t]; 15 return fa[x]; 16 } 17 int main() 18 { 19 for(int i=1;i<=30000;i++) 20 { 21 fa[i]=i; 22 last[i]=i; 23 dis[i]=0; 24 } 25 cin>>T; 26 char cmd[5]; 27 int x,y; 28 for(int i=1;i<=T;i++) 29 { 30 scanf("%s%d%d",&cmd,&x,&y); 31 if(cmd[0]==‘M‘) 32 { 33 int f1=find(x); 34 int f2=find(y); 35 if(f1!=f2) 36 { 37 fa[f1]=last[f2]; 38 last[f2]=last[f1]; 39 dis[f1]=1; 40 } 41 } 42 else if(cmd[0]==‘C‘) 43 { 44 int f1=find(x); 45 int f2=find(y); 46 int ans=fabs(dis[x]-dis[y])-1; 47 if(f1==f2)printf("%d\n",ans); 48 else printf("-1\n"); 49 } 50 } 51 return 0; 52 }
注释:dis[]记录到队首战舰的距离。last[]记录该战舰列的队尾战舰的编号。fa[]这个就不必解释了。相信各位大神犇们都很容易弄懂的吧~~
标签:des style blog http color io os ar for
原文地址:http://www.cnblogs.com/Skyvot/p/4037270.html