HDU 1232 畅通工程

来源:互联网 发布:java内存模型视频教程 编辑:程序博客网 时间:2024/06/05 08:25

题意:n个城镇,m条路,列出了每条道路直接连通的城镇,目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? 

解题思路:并查集求连通分支数.需要建设的道路数等于连通分支数-1,找连通分支可以用父结点等于自身的方法,有几个父结点等于自身就说明有几个连通分支

代码:

#include <iostream>#include <algorithm>#include <cstring>#include <string>#include <cmath>#include <cstdio>using namespace std;const int maxn=1000+10;int n,m;int par[maxn],rank_[maxn];void init(){    for(int i=1;i<=n;i++)    {        par[i]=i;        rank_[i]=0;    }}int find_(int x){    if(par[x]==x)return x;    else return par[x]=find_(par[x]);}void unite(int x,int y){    x=find_(x);    y=find_(y);    if(x==y)return ;    if(rank_[x]<rank_[y])par[x]=y;    else    {        par[y]=x;        if(rank_[x]==rank_[y])rank_[x]++;    }}bool same(int x,int y){    return find_(x)==find_(y);}int main(){    while(scanf("%d",&n)&&n)    {        init();        scanf("%d",&m);        int a,b;        for(int i=0;i<m;i++)        {            scanf("%d%d",&a,&b);            unite(a,b);        }        int ans=0;        for(int i=1;i<=n;i++)        {            if(par[i]==i)ans++;//父结点等于自身        }        printf("%d\n",ans-1);    }    return 0;}


原创粉丝点击