int main() { int cases,n,i,a,b,y,no,t = 0; char c; scanf("%d",&cases); while(cases--){ if(t != 0) printf("\n"); t++; scanf("%d",&n); for (i = 0; i <= n; i++) Make_Set(i); y = no = 0; getchar(); while(c = getchar(),c != EOF){ if(c == '\n') break; scanf(" %d %d",&a,&b); a = Find_Set(a); b = Find_Set(b); if(c == 'c') Union_Set(a,b); else if(c == 'q'){ if(a == b) y++; else no++; } else break; getchar(); } printf("%d,%d\n",y,no); } return 0; }
// compute the connected components of a graph void Connected_Components(void) { int i; for (i = 0; i < N; i++) { Make_Set(i); } for (i = 0; i < 7; i++) { if(Find_Set(E[i][0])!=Find_Set(E[i][1])) { Union(E[i][0],E[i][1]); } } }
void MST_Kruskal(struct vertex *G,int n,int E) { int i,j; struct edge *A[n-1],*temp,*e[E]; for(i=0;i<n;i++) Make_Set(G,i); for(i=0,j=0;i<n;i++) for(temp=G[i].edgep;temp;temp=temp->next) e[j++]=temp; Heap_Sort(e,E); for(i=0,j=0;i<E;i++) if(Find_Set(G,e[i]->start)!=Find_Set(G,e[i]->destin)) { A[j++]=e[i]; Union(G,e[i]->start,e[i]->destin); } Vertex_Detail_Prim(A,j); }
int main() { freopen("t.in", "r", stdin); scanf("%d %d\n",&n,&k); for(int i = 1; i <= n; i ++) Make_Set(i); for(int i = 1, d, x, y; i <= k; i ++) { scanf("%d %d %d\n",&d,&x,&y); if(x > n || y > n || (d == 2 && x == y)) { cnt ++; continue; } int p = Find_Set(x), q = Find_Set(y); if(p != q) Union(x, y, d); else if((relation[y] + d + 2) % 3 != relation[x]) cnt ++; } printf("%d\n",cnt); }
int main() { int a, b; while(scanf("%d", &N) && N) { for(int i=1; i<=N; ++i) Make_Set(i); scanf("%d", &M); while(M--) { scanf("%d %d", &a, &b); Union(a, b); } int cnt = -1; for(int i=1; i<=N; ++i) if(father[i]==i) cnt++; printf("%d\n", cnt); } return 0; }
int main() { freopen("t.in","r",stdin); scanf("%d", &m); int n = MAXN; for(int i = 1; i <= n; i ++) Make_Set(i); for(int i = 1; i <= m; i ++) { int a, b; char ctrl; scanf("\n%c %d", &ctrl, &a); if(ctrl == 'M') scanf("%d", &b); if(ctrl == 'M') Merge(a, b); else { Find_Set(a); printf("%d\n", dist[a]); } } }