思路
并查集,n个节点最少需要建设n-1条边,每有一个连接不同集合的边出现,所需建设的路就少一条。
代码
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1000;
int par[maxn+10];
int get_par(int a)
{
if(par[a]<0) return a;
else return par[a] = get_par(par[a]);
}
bool merge(int a, int b)
{
int pa = get_par(a);
int pb = get_par(b);
if(pa!=pb)
{
par[pa] = pb;
return true;
}
return false;
}
int main()
{
int n, m, ans;
int a, b;
while(scanf("%d", &n)&&n)
{
scanf("%d", &m);
ans = n-1;
memset(par, -1, sizeof(par));
for(int i=0; i<m; i++)
{
scanf("%d%d", &a, &b);
if(merge(a, b)) ans--;
}
printf("%d\n", ans);
}
return 0;
}