概述:某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
思路:并查集的问题,非常典型。
感想:半个月前开的这套题,然后上周才a的,今天才来写这个博客,有点晚。。
#include<iostream>
using namespace std;
int a[1002];
int findx(int x)
{
int b=x;
while(a[b]!=b)
b=a[b];
return b;
}
void merger(int x,int y)
{
int fx,fy;
fx = findx(x);
fy = findx(y);
if(fx != fy)
a[fx] = fy;
}
int main()
{
int N,M,x,y,count;
while(cin>>N&&N)
{
count=-1;
cin>>M;
for(int i=1;i<=N;i++)
a[i]=i;
for(int i=M;i>0;i--)
{
cin>>x>>y;
merger(x,y);
}
for(int i=1;i<=N;i++)
if(a[i]==i)
count++;
cout<<count<<endl;
}
return 0;
}