您的位置:首页 > 其它

HDU-1232-畅通工程

2012-08-25 19:20 253 查看
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1232

/*

程序分析:

  给你一些城市、城市之间的某些路,让你求最少还要再建多少条路才能实现城市与城市之间两两相通。

需要注意的是,两个城市之间可以有多条路,多条也当它一条处理。如果城市之间都没有路,需要建的路

就是城市的个数减一。

解决方法:

  利用并查集的特性,把城市之间有路的合并为一个城市,最后判定有几个城市或者有几棵树就可以了。

结果也就是城市(树)数目减一,比如有三个城市就要有2条路来让他们互通! 具体看代码吧

*/

View Code

#include<iostream>
using namespace std;
#define max 50001

int p[max];
bool k[max];

int find(int pos)
{
if(p[pos]==-1)return pos;
return p[pos]=find(p[pos]);
}
int uni(int x,int y)
{
int a=find(x);
int b=find(y);
if(a==b)return 0;
p[a]=b;
return 1;
}

int main()
{
int temp;
int a,b;
int n,m;
while(cin>>n&&n&&cin>>m)
{
//初始化
for(int i=1;i<=n;i++)
{
p[i]=-1;
k[i]=0;
}
//输入  合并
for(int i=1;i<=m;i++)
{
cin>>a>>b;
uni(a,b);
}
//标记
for(int i=1;i<=n;i++)
{
temp=find(i);
k[temp]=1;
}
//统计
int add=0;
for(int i=1;i<=n;i++)
{
if(k[i]==1)
add++;
}
printf("%d\n",add-1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: