2011-06-17 23:15:08 理好思路,在码代码!!!!! #include<iostream> #include<math.h> #define N 30010 using namespace std; int par[N],cnt[N],root[N],count; int FIND(int x) { if(par[x]==x) return x; par[x] = FIND(par[x]); count+=cnt[x]; cnt[x]=count; //cout<<x<<endl; return par[x]; } void UNION(int px,int py) { par[py]=px; cnt[py]=root[px]; root[px]+=root[py]; return ; } int main() { int i,x,y,p,n,m,px,py; scanf("%d%d",&n,&m); for(i=0;i<n;i++) { par[i]=i; // cout<<par[i]<<endl; cnt[i]=0; // 编号为i的元素到其根的之间有几个元素(包括根,但不包括自己) root[i]=1; // 以i为根的集合的元素的个数 } for(i=0;i<m;i++) { scanf("%d%d%d",&p,&x,&y); count=0; px=FIND(x); count=0; py =FIND(y); if(p==1) { if(px==py) { printf("ERROR/n"); } else { //cout<<x<<" "<<y<<endl; UNION(px,py); } } else { if(px!=py) { printf("NO/n"); } else { printf("YES %d/n",abs(cnt[x]-cnt[y])-1); } } } return 0; }