题目连接请戳
解题思路
比较容易想到的思路是开辟另一数组记录每个成员对应的敌人。
之后想明白每个团体只和一个团体敌对就行了。
代码
#include#include #define N 10010int fri[N], ene[N];int n;void make_set(int n){ for (int i = 1; i <= n; i++) fri[i] = i;}int find(int x){ return (x == fri[x]) ? x : fri[x] = find(fri[x]);}int main(){ int c, a, b; scanf("%d", &n); make_set(n); for (int i = 1; i <= n; i++) ene[i] = 0; scanf("%d%d%d", &c, &a, &b); while (!(c == 0 && a == 0 && b == 0)) { a++; b++; int fa = find(a); int fb = find(b); int qa = ene[fa], qb = ene[fb]; if (qa != 0) qa = find(qa); if (qb != 0) qb = find(qb); if (c == 1) { if (qa == fb && qb == fa) printf("-1\n"); else { if (qa != 0 && qb != 0) { fri[qa] = qb; fri[fa] = fb; } else if (qa != 0) fri[fb] = fa; else if (qb != 0) fri[fa] = fb; else fri[fa] = fb; } } else if (c == 2) { if (fa == fb) printf("-1\n"); else { ene[fa] = fb; ene[fb] = fa; if (qa != 0) fri[qa] = fb; if (qb != 0) fri[qb] = fa; } } else if (c == 3) { if (fa == fb) printf("1\n"); else printf("0\n"); } else if (c == 4) { if (qa == fb && qb == fa) printf("1\n"); else printf("0\n"); } scanf("%d%d%d", &c, &a, &b); } return 0;}