A - The Suspects
#include <iostream>
using namespace std;
const int N = 30000 + 5;
int p[N];
int find (int x);
void merge (int x, int y);
int n, m;
int ans;
int i;
int k, head;
int x;
int t1, t2;
int main()
{
while (~scanf("%d %d", &n, &m) && (n || m))
{
ans = 0;
for (i = 0; i < n; ++ i)
{
p[i] = i;
}
for (i = 0; i < m; ++ i)
{
scanf ("%d %d", &k, &head);
k --;
while (k --)
{
scanf ("%d", &x);
merge (head, x);
}
}
for (i = 0; i < n; ++ i)
{
if (find(i) == find(0))
{
ans ++;
}
}
printf("%d\n", ans);
}
return 0;
}
int find (int x)
{
if (p[x] != x)
{
p[x] = find(p[x]);
}
return p[x];
}
void merge (int x, int y)
{
t1 = find(x);
t2 = find(y);
if (t1 == t2)
{
return;
}
p[t1] = t2;
return;
}
B - Ubiquitous Religions
#include <iostream>
using namespace std;
const int maxn = 50000 + 5;
int p[maxn];
int find (int x);
void merge (int x, int y);
int n, m;
int ans;
int i;
int t1, t2;
int x1, x2;
int place;
int main()
{
while (~scanf("%d %d", &n, &m) && (n || m))
{
for (i = 1; i <= n; ++ i)
{
p[i] = i;
}
while (m --)
{
scanf ("%d %d", &x1, &x2);
merge (x1, x2);
}
ans = 0;
for (i = 1; i <= n; ++ i)
{
if (p[i] == i)
{
ans ++;
}
}
printf("Case %d: %d\n", ++ place, ans);
}
return 0;
}
int find (int x)
{
if (p[x] != x)
{
p[x] = find(p[x]);
}
return p[x];
}
void merge (int x, int y)
{
t1 = find(x);
t2 = find(y);
if (t1 == t2)
{
return;
}
p[t1] = t2;
}
C - How Many Tables
#include <iostream>
using namespace std;
const int maxn = 1000 + 5;
int p[maxn];
int find (int x);
void merge (int x, int y);
int T;
int n, m;
int x1, x2;
int ans;
int t1, t2;
int i;
int main()
{
scanf ("%d", &T);
while (T --)
{
scanf ("%d %d", &n, &m);
for (i = 1; i <= n; ++ i)
{
p[i] = i;
}
while (m --)
{
scanf ("%d %d", &x1, &x2);
merge (x1, x2);
}
ans = 0;
for (i = 1; i <= n; ++ i)
{
if (p[i] == i)
{
ans ++;
}
}
printf("%d\n", ans);
}
return 0;
}
int find (int x)
{
if (p[x] != x)
{
p[x] = find(p[x]);
}
return p[x];
}
void merge (int x, int y)
{
t1 = find(x);
t2 = find(y);
if (t1 == t2)
{
return;
}
p[t1] = t2;
}
D - 小希的迷宫
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 100000 + 5;
int p[maxn];
bool vis[maxn];
int find (int x);
void merge (int x, int y);
int m, n, i, flag, sum;
int main()
{
while (scanf("%d %d", &m, &n))
{
if (m == -1 && n == -1)
{
break;
}
if (m == 0 && n == 0)
{
puts("Yes");
continue;
}
flag = 1;
for(i = 0;i < maxn; i ++)
{
p[i] = i;
vis[i] = 0;
}
vis[m] = vis[n] = 1;
merge (m, n);
while (scanf("%d %d", &n, &m), n + m)
{
vis[n] = vis[m] = 1;
merge(n, m);
}
if(!flag)
{
puts("No");
continue;
}
sum = 0;
for(i = 0; i < maxn; i ++)
{
if (vis[i] && p[i] == i)
{
sum ++;
}
if (sum > 1)
{
break;
}
}
if(sum > 1)
{
puts("No");
}
else
{
puts("Yes");
}
}
return 0;
}
int find (int x)
{
if (p[x] == x) return x;
return find (p[x]);
}
int t1, t2;
void merge (int x, int y)
{
t1 = find(x);
t2 = find(y);
if (t1 != t2)
{
p[t1] = t2;
return;
}
flag = 0;
}
E - News Distribution
#include <iostream>
using namespace std;
const int maxn = 5e5 + 5;
int p[maxn], z[maxn];
int find (int x);
void merge (int x, int y);
int n, m;
int k, t, x;
int i;
int main()
{
scanf ("%d %d", &n, &m);
for (i = 1; i <= n; i ++ )
{
p[i] = i;
}
while (m --)
{
scanf ("%d", &k);
if (k) scanf("%d", &t);
for (i = 1; i < k; i ++)
{
scanf ("%d", &x);
merge (x, t);
}
}
for (i = 1; i <= n; i ++)
{
z[find(i)] ++;
}
for (i = 1; i <= n; i ++)
{
printf ("%d ", z[find(i)]);
}
return 0;
}
int find (int x)
{
if (p[x] != x)
{
p[x] = find(p[x]);
}
return p[x];
}
int t1, t2;
void merge (int x, int y)
{
t1 = find(x);
t2 = find(y);
if (t1 == t2)
{
return;
}
p[t1] = t2;
}
F - Cyclic Components
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int i, j, n, m, a, b, cnt, p[maxn],deg[maxn];
vector <int> vec[maxn];
void init ()
{
cnt = 0;
for (i = 1; i <= n;i ++)
{
p[i] = i;
}
memset (deg, 0, sizeof(deg));
for(i = 1; i <= n;i ++)
{
vec[i].clear();
}
}
int find (int x)
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
void merge (int x, int y)
{
x = find(x);
y = find(y);
if(x != y) p[x]=y;
}
int main()
{
scanf("%d %d", &n, &m);
init();
while(m --)
{
scanf("%d %d", &a, &b);
merge (a, b);
deg[a] ++;
deg[b] ++;
}
for(i = 1; i <= n; i ++)
{
vec[find(i)].push_back(i);
}
for(i = 1; i <= n; i ++)
{
if(vec[i].size() > 2)
{
bool flag = false;
for(j = 0; j < vec[i].size(); j ++)
{
if(deg[vec[i][j]] != 2)
{
flag = true;
break;
}
}
if(!flag)
{
cnt ++;
}
}
}
printf ("%d", cnt);
return 0;
}