hdu 1232 畅通工程(求最少多少条边可以使所有点联通)
2015-10-31 10:42
483 查看
题目地址
题目大意:给出点及边,点按1到n编号,求最少需要多少条边可以将所有的点联通
解题思路:并查集求有多少个根节点,减一即为答案
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000+100;
int par[maxn];
int Find(int x)
{
return x==par[x] ? x : Find(par[x]);
}
void Union(int x,int y)
{
int px = Find(x),py = Find(y);
if(px != py)
par[px] = py;
}
int main()
{
int n,m;
while(scanf("%d",&n) != EOF)
{
if(!n) break;
scanf("%d\n",&m);
for(int i = 1; i <= n; i++)
par[i] = i;
int x,y;
for(int i = 0; i < m; i++)
{
scanf("%d%d",&x,&y);
Union(x,y);
}
int ans = 0;
for(int i = 1; i <= n; i++)
{
if(par[i] == i)
ans++;
}
printf("%d\n",ans-1);
}
return 0;
}
题目大意:给出点及边,点按1到n编号,求最少需要多少条边可以将所有的点联通
解题思路:并查集求有多少个根节点,减一即为答案
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000+100;
int par[maxn];
int Find(int x)
{
return x==par[x] ? x : Find(par[x]);
}
void Union(int x,int y)
{
int px = Find(x),py = Find(y);
if(px != py)
par[px] = py;
}
int main()
{
int n,m;
while(scanf("%d",&n) != EOF)
{
if(!n) break;
scanf("%d\n",&m);
for(int i = 1; i <= n; i++)
par[i] = i;
int x,y;
for(int i = 0; i < m; i++)
{
scanf("%d%d",&x,&y);
Union(x,y);
}
int ans = 0;
for(int i = 1; i <= n; i++)
{
if(par[i] == i)
ans++;
}
printf("%d\n",ans-1);
}
return 0;
}
相关文章推荐
- 使用html添加链接
- 谷歌API指南:设备通用性 1/2
- PHP解决抢购、秒杀、抢楼、抽奖等阻塞式高并发库存防控超量的思路方法
- Android有效解决加载大图片时内存溢出的问题
- 简单的C语言猜数字小游戏
- 简单的C语言猜数字小游戏
- Winform中的Treeview动态绑定数据库
- 黑马程序员—函数及数组
- 【C#】C#之类
- Codeforces Round #327 (Div. 2)
- ios学习笔记(二)基础控件
- ios学习笔记(二)基础控件
- 51nod 1127 最短的包含字符串 (滑动窗口)
- NSDate的计算问题,日期计算,时区问题,NSTimer
- 百度地图实现固定坐标定位
- express和json的调用
- 商务英语学习第一课(lending(借贷))
- 麻省理工大学新发明:暗黑WiFi透视技术
- TouchSwipe在Android设备上的pageX和PageY为0的问题
- hdu 1116 Play on Words(并查集求是否所有在一集合里)