并查集求解,有n个城市,一共需要n-1条路,对于每条道路,将两个城市加入并查集,并将现有道路的条数sumb++,最后还需要建立的道路为:n-1-numb。代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int parent[1001];
int n, m;
void Init()
{
for(int i=0; i<1001; ++i)
parent[i] = i;
}
int Find(int x)
{
return parent[x]==x ? x : parent[x]=Find(parent[x]);
}
void Union(int a, int b)
{
int pa = Find(a);
int pb = Find(b);
if(pa != pb)
parent[pb] = pa;
}
int main()
{
int i, j, a, b;
while(~scanf("%d", &n) && n)
{
int sum = 0;
scanf("%d", &m);
Init();
for(i=0; i<m; ++i)
{
scanf("%d%d", &a, &b);
int pa = Find(a);
int pb = Find(b);
if(pa != pb)
{
Union(a, b);
++sum;
}
}
cout << n-1-sum << endl;
}
return 0;
}