POJ 1703 Find them, Catch Them 並查集
阿新 • • 發佈:2020-12-17
//並查集 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 1e5+5; int fa[MAXN*2]; int T, N, M, a, b; char c; int find(int x){ if(x != fa[x]) fa[x] = find(fa[x]); return fa[x]; } void unite(int x, int y){ int fx = find(x); int fy = find(y); fa[fx] = fy; } bool same(int x, int y){ return find(x) == find(y); } int main(){ scanf("%d", &T); while(T--){ scanf("%d %d", &N, &M); memset(fa, -1, sizeof fa); // -1 表示未確定 while(M--){ scanf(" %c", &c); scanf(" %d %d", &a, &b); if(c == 'D'){ if(fa[a] == -1) fa[a] = a, fa[a+N] = a+N; if(fa[b] == -1) fa[b] = b, fa[b+N] = b+N; //a 和 b+N , a+N 和 b 在一組表示不同 unite(a, b+N); unite(a+N, b); } else if(c == 'A'){ if(fa[a] == -1 || fa[b] == -1) printf("Not sure yet.\n"); else if(same(a, b)) printf("In the same gang.\n"); else if(same(a, b+N)) printf("In different gangs.\n"); else printf("Not sure yet.\n"); //AB不同, CD不同,不能確定A和C的關係 } } } system("pause"); return 0; }