这个题的题意是 当输入‘E'是查找操作,查找从后面这个数到他的父亲这边的值,‘I’代表把后面的数作为前面数的父亲
然后他们两个的差值代表这两个边的权值
水水的题
#include <stdio.h> #include <string.h> int par[20005]; int rank1[20005]; int abs(int hh) { return (hh>0)?hh:-hh; } void init() { for(int i=0;i<20005;i++) { par[i]=i; rank1[i]=0; } } int findset(int x) { int root; if(x!=par[x]) { root=findset(par[x]); rank1[x]+=rank1[par[x]]; par[x]=root; } return par[x]; } int main() { int T; int k; int a,u,v; char s[10]; while(scanf("%d",&T)==1) { while(T--) { scanf("%d",&k); init(); while(scanf("%s",s)!=EOF) { if(s[0]=='O') break; if(s[0]=='E') { scanf("%d",&a); findset(a); printf("%d\n",rank1[a]); } else { scanf("%d%d",&u,&v); par[u]=v; rank1[u]=abs(u-v)%1000; //printf("%d %d\n",u,rank1[u]); } // printf("%d %d %d %d\n",rank1[1],rank1[2],rank1[3],rank1[4]); } } } }