题目链接:http://codeforces.com/gym/100923/problem/H
分析:并查集,用enemy储存x的敌人,用weight储存权重决定根节点
需用scanf和puts输入输出否则会爆
1 #include<iostream> 2 #include<sstream> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<string> 6 #include<cstring> 7 #include<algorithm> 8 #include<functional> 9 #include<iomanip> 10 #include<numeric> 11 #include<cmath> 12 #include<queue> 13 #include<vector> 14 #include<set> 15 #include<cctype> 16 #define PI acos(-1.0) 17 const int INF = 0x3f3f3f3f; 18 const int NINF = -INF - 1; 19 const int maxn = 1e5 + 5; 20 typedef long long ll; 21 using namespace std; 22 int n, m; 23 int fa[maxn], enemy[maxn], weight[maxn]; 24 int find(int x) 25 { 26 return x == fa[x] ? x : fa[x] = find(fa[x]); 27 } 28 void unite(int x, int y) 29 { 30 if (weight[x] < weight[y]) fa[x] = y; 31 else 32 { 33 fa[y] = x; 34 if (weight[x] == weight[y]) weight[x]++; 35 } 36 } 37 int main() 38 { 39 //std::ios::sync_with_stdio(false); 40 freopen("meciul.in", "r", stdin); 41 freopen("meciul.out", "w", stdout); 42 int T; 43 scanf("%d", &T); 44 while (T--) 45 { 46 scanf("%d%d", &n, &m); 47 memset(enemy, 0, sizeof(enemy)); 48 memset(weight, 0, sizeof(weight)); 49 for (int i = 1; i <= n; ++i) fa[i] = i; 50 while (m--) 51 { 52 int x, y; 53 scanf("%d%d", &x, &y); 54 int f1 = find(x), f2 = find(y); 55 if (f1 == f2) puts("NO"); 56 else 57 { 58 if (!enemy[x]) enemy[x] = y; 59 else unite(f2, find(enemy[x])); 60 if (!enemy[y]) enemy[y] = x; 61 else unite(f1, find(enemy[y])); 62 puts("YES"); 63 } 64 } 65 } 66 return 0; 67 }