POJ 4026 Eve 并查集 好题
哈哈
View Code
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define maxn 300003 int vis[maxn]; struct node { int sex, fa, de, DNA; // sex性别,fa父亲节点, de是不是死了; }p[maxn]; int a[maxn]; int n, m, k; int find(int x) { return p[x].fa == x ? x : p[x].fa = find(p[x].fa); } void merge(int x, int y) { int rx = find(x); int ry = find(y); if(rx != ry) p[ry].fa = rx; } int main() { int i; int x, y, len, sum; char buf[555]; while( ~scanf("%d", &n)) { for(i = 1; i <= maxn - 1; i++) { p[i].fa = i; p[i].de = 0; p[i].DNA = -1; } for(i = 1; i <= n; i++) { scanf("%s", buf); if(buf[0] == 'M') p[i].sex = 0; else p[i].sex = 1; } scanf("%d", &m); getchar(); while(m--) { gets(buf); len = strlen(buf); if(buf[0] == '-') { sum = 0; for(i = 1; i < len; i++) sum = sum * 10 + buf[i] - '0'; p[sum].de = 1; } else if(buf[len-1] == 'F' || buf[len-1] == 'M') { i = 0; x = y = 0; char c = buf[len-1]; while(buf[i] != ' ') x = x * 10 + buf[i] - '0', i++; i++; while(buf[i] != ' ') y = y * 10 + buf[i] - '0', i++; if(c == 'F') p[++n].sex = 1; else p[++n].sex = 0; if(p[x].sex == 1) merge(x, n); else merge(y, n); } } scanf("%d", &k); while(k--) { scanf("%d%d", &x, &y); int rx = find(x); p[rx].DNA = y; } int num = 0; for(i = 1; i <= n; i++) if(!p[i].de) a[num++] = find(i); sort(a, a + num); num = unique(a, a + num) - a; if(num == 1) puts("YES"); else { int cnt = 0; for(i = 0; i < num; i++) if(p[a[i]].DNA == -1) cnt++; if(cnt > 0) { int ans = -1; for(i = 0; i < num; i++) { if(p[a[i]].DNA == -1) continue; if(ans == -1) ans = p[a[i]].DNA; else if(ans != p[a[i]].DNA) break; } if(i == num) puts("POSSIBLY"); else puts("NO"); } else if(cnt == 0) { for(i = 1; i < num; i++) if(p[a[0]].DNA != p[a[i]].DNA) break; if(i == num) puts("YES"); else puts("NO"); } } } return 0; }


浙公网安备 33010602011771号