solution-p2097
题解 P2097 【资料分发1】
题意:给定一个无向图,求这个图的连通块数量。
蒟蒻不会Tarjan,懒得打dfs,于是就写了个简单的并查集。
如果起点和终点不在一个集合内,那么就将它们所在的集合合并
一开始将ans设为点数,每次合并将ans-1即可。
ps:不会并查集的同学可以参考这里
代码
// 此处应有头文件
const int N = 1e5 + 10;
int n,m;
int f[N];
int ans;
int find(int x)
{
if( x == f[x] )
return x;
return f[x] = find( f[x] ); // 路径压缩
}
int main()
{
cin >> n >> m;
ans = n;
for(int i = 1;i <= n;i++)
f[i] = i; // 并查集初始化
for(int i = 1;i <= m;i++)
{
int p,q;
cin >> p >> q;
int a = find(p); // p的老大
int b = find(q); // q的老大
if(a != b)
{
f[a] = b; // 合并集合
--ans;
}
}
cout << ans << endl;
return 0;
}

浙公网安备 33010602011771号