HDU1232 畅通工程 并查集求连通分量

来源:互联网 发布:藤原文太 知乎 编辑:程序博客网 时间:2024/04/28 12:50

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232


题目大意:已知n个村庄之间有若干条通路,求出使他们联通所需添加的最少道理数。


分析:并查集记录已经联通的村庄集合,集合内部已经联通,m个集合之间需要添加m-1条道路来联通。


实现代码如下:

#include <cstdio>#include <iostream>using namespace std;const int maxn=1000;int par[maxn];void init(int n){    for(int i=1;i<=n;i++)      par[i]=i;}int find(int x){    while(par[x]!=x)      x=par[x];    return x;}void combine(int a,int b){    int fa=find(a);    int fb=find(b);    if(fa!=fb)      par[fa]=fb;}int main(){    int n,m;    while(cin>>n&&n)    {        init(n);        cin>>m;        int a,b;        for(int i=0;i<m;i++)        {            cin>>a>>b;            combine(a,b);        }        int ans=0;        for(int i=1;i<=n;i++)          if(par[i]==i) ans++;        cout<<ans-1<<endl;    }    return 0;}


0 0
原创粉丝点击