题目链接:http://poj.org/problem?id=1962
思路:每个集合中用根节点标记这个集合,每个点到根节点的距离。
code:
<span style="font-size:18px;">#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<cstring> #include<set> using namespace std; const int maxn=20005; int pa[maxn],d[maxn]; int findset(int x) //找出x节点到根节点的距离 { if(pa[x]!=x) { int root=findset(pa[x]); d[x]+=d[pa[x]]; //更新x节点的距离 return pa[x]=root; } else return x; } int main() { int T; scanf("%d",&T); while(T--) { int n; char str[10]; scanf("%d",&n); for(int i=1;i<=n;i++) { pa[i]=i; d[i]=0; } while(scanf("%s",str)) { if(str[0]=='O') break; if(str[0]=='E') { int x; scanf("%d",&x); findset(x); printf("%d\n",d[x]); } if(str[0]=='I') { int x,y; scanf("%d%d",&x,&y); pa[x]=y; d[x]=abs(x-y)%1000; } } } return 0; } </span>
时间: 2024-10-09 15:54:18