题意
求连通图的数量,及多少个连通图有环,其中只存在一个结点的图不属于连通图
思路
用并查集维护连通图的数量,每个连通图含有的结点的数量及含有的边的数量
code
#include<bits/stdc++.h>
using namespace std;
const int N = 2e6+7;
int t, n, m, fa[N], son[N], edge[N], id;
void init(int n)
{
for(int i = 1; i <= n; i++)
fa[i] = i, son[i] = 1, edge[i] = 0;
}
int find(int x)
{
return (x == fa[x] ? x : fa[x] = find(fa[x]));
}
void merge(int x, int y)
{
int fx = find(x), fy = find(y);
if(fx != fy)
{
fa[fx] = fy;
son[fy] += son[fx];
edge[fy] += edge[fx] + 1;
}
else
edge[fy]++;
}
int main()
{
scanf("%d", &t);
while(t--)
{
cin >> n >> m;
init(n);
for(int i = 1; i <= m; i++)
{
int u, v;
cin >> u >> v;
merge(u, v);
}
int cnt1 = 0, cnt2 = 0;
for(int i = 1; i <= n; i++)
{
if(fa[i] == i && son[i] > 1)
{
cnt1++;
if(edge[i] > son[i] - 1)
cnt2++;
}
}
printf("Night sky #%d: %d constellations, of which %d need to be fixed. \n\n", ++id, cnt1, cnt2);
}
return 0;
}