poj 1962 Corporative Network
题目链接: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>
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。