HDU 1232 畅通工程(并查集)

来源:互联网 发布:matlab数据分析 编辑:程序博客网 时间:2024/06/04 19:30

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

题目意思

某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?

解题思路

假定一开始点都是分开的,那么就要修n-1条路,然后每次输入路径时候判断两个城市是否已经相连,如果没有,修的路径减少1.处理方法用并查集处理,每次判断两个点的根节点是否相同,相同则已经相连。

代码部分

#include<bits/stdc++.h>using namespace std;#define ll long longint pre[1005];int unionsearch(int root){    int son;    son=root;    while (root!=pre[root])  ///查找根节点    {        root=pre[root];    }    while (son!=root)  ///路径压缩    {        int tem=pre[son];        pre[son]=root;        son=tem;    }    return root;}int main(){    int n,m;    while (scanf("%d",&n)&&n)    {        scanf("%d",&m);        int ans=n-1;   ///一开始无路连通,要修n-1条路        int x,y;        for (int i=1;i<=n;i++)        {            pre[i]=i;        }        for (int i=0;i<m;i++)        {            scanf("%d %d",&x,&y);            x=unionsearch(x);            y=unionsearch(y);            if (x!=y)    ///如果原本x和y不在一个树,那么少修一条路            {                pre[x]=y;                ans--;            }        }        printf("%d\n",ans);    }    return 0;}
原创粉丝点击