菜鸟生成记(51)
P1536 村村通
这算是一个生成树+并查集的模板题吧!
思路:生成树和并查集
#include<iostream>
#include<map>
#include<set>
#include<string>
using namespace std;
int f[1100]={0};//父辈数组
int find1(int x)//查询x的祖先
{
int t=x;
while(t!=f[t])
{
t=f[t];
}
return t;//返回祖先
}
int main()
{
int n,m;
while(cin>>n>>m)
{
int k=0;
for(int i=1;i<=n;i++)//初始化
f[i]=i;//自己是自己的爸爸
for(int i=0;i<m;i++)
{
int x,y,t1,t2;
cin>>x>>y;
//并查集-合并(将x,y并入一个连通分量)
t1=find1(x);//压缩路径
t2=find1(y);
f[t2]=t1;
f[y]=t1;
}
for(int i=1;i<=n;i++)
if(f[i]==i)//合并集合后,自己是自己的爸爸的,视为一个连通分量(生成树)
k++;//k个连通分量
/*
k个连通分量可以看作k个孤立点(结点)
k个结点并入一个连通分量(生成树)需要k-1条边
*/
cout<<k-1<<endl;
}
return 0;
}