[洛谷P1536]村村通

题意:多组数据,当n为0时结束,每组数据表示有n个村子,m条路,求还需要建多少条路,使得所有的村子联通
题解:用并查集求出有多少个联通块,然后求解

C++ Code:

#include<cstdio>
using namespace std;
const int maxn=1010;
int n,m,ans;
int f[maxn];
int find(int x){return (x==f[x]?x:(f[x]=find(f[x])));}
int main(){
	scanf("%d",&n);
	while(n!=0){
		scanf("%d",&m);
		for (int i=0;i<=n;i++)f[i]=i;
		ans=n-1;
		for (int i=0;i<m;i++){
			int a,b;
			scanf("%d%d",&a,&b);
			int x=find(a),y=find(b);
			if (x!=y){
				f[x]=f[y];
				ans--;
			}
		}
		printf("%d
",ans);
		scanf("%d",&n);
	}
	
	return 0;
}
原文地址:https://www.cnblogs.com/Memory-of-winter/p/8251994.html