hdoj 1232 畅通工程 【并查集】

畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 37403    Accepted Submission(s): 19808

Problem Description

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

Input

测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。

注意:两个城市之间可以有多条道路相通,也就是说

3 3

1 2

1 2

2 1

这种输入也是合法的

当N为0时,输入结束,该用例不被处理。

Output

对每个测试用例,在1行里输出最少还需要建设的道路数目。

Sample Input

4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0

Sample Output

1
0
2
998
 
代码1:
 
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
using namespace std;
int per[1100];
int n,m;
int init()
{
	int i;
	for(i=1;i<=n;i++)
	{
		per[i]=i;
	}
}
int find(int x)
{
	int r=x;
	while(r!=per[r])
	{
		r=per[r];
	}
	int i,j;
	i=x;
	while(i!=r)
	{
		j=per[i];
		per[i]=r;
		i=j;
	}
	return r;
}
int join(int x,int y)
{
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy)
	per[fx]=fy;
}
int main()
{
	int a,b;
	while(scanf("%d",&n)!=EOF&&n!=0)
	{
		scanf("%d",&m);
		init();
		while(m--)
		{
			scanf("%d%d",&a,&b);
			join(a,b);
		}
		int ans=0;
		for(int i=1;i<=n;i++)
		{
			if(i==per[i])
			{
				ans++;
			}
		}
		printf("%d\n",ans-1);
	}
	return 0;
}

代码2:

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
using namespace std;
int per[1100];
int n,m;
int init()
{
    int i;
    for(i=1;i<=n;i++)
    {
        per[i]=i;
    }
}
int find(int x)
{
    int r;
    r=x;
    while(r!=per[r])
    {
        r=per[r];
    }
    per[x]=r;
    return r;
}
int join(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fx!=fy)
    per[fx]=fy;
}
int main()
{
    int a,b;
    while(scanf("%d",&n)&&n!=0)
    {
        scanf("%d",&m);
        init();
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&a,&b);
            join(a,b);
        }
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            if(i==per[i])
            {
                ans++;
            }
        }
        printf("%d\n",ans-1);
    }
    return 0;
}

 
 
 

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 13:27:17

hdoj 1232 畅通工程 【并查集】的相关文章

HDU 1232 畅通工程(并查集)

畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 30485    Accepted Submission(s): 16013 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有

HDU ACM 1232 畅通工程-&gt;并查集

分析: 地图上有若干个城镇,城镇都可以看作点,然后给出哪些城镇之间是直接相连的.要解决的是整幅图的连通性问题.比如两个点,判断它们是否连通,或者整幅图共有几个连通分支,就是被分成多少个互相独立的块.因此这个题实质就是求有几个连通分支:如果是1个,则整幅图都连起来了:如果是2个,只要再修1条路,在两个分支中各选一个点,连起来,这样所有点就连起来了:3个连通分支,则只需再修两条......,这样就可以使用并查集很好的解决了. #include<iostream> using namespace s

并查集 HDOJ 1232 畅通工程

题目传送门 1 /* 2 并查集(Union-Find)裸题 3 并查集三个函数:初始化Init,寻找根节点Find,连通Union 4 考察:连通边数问题 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cstring> 9 #include <cmath> 10 using namespace std; 11 12 const int MAX_N = 1000 + 10; 13 in

HDU1232 畅通工程 并查集

这道题跟HDU 1213 How Many Tables 并查集非常接近,都是赤裸裸的并查集的题. 思路:假设还需要建n-1条路,每并一次就自减1. 参考代码: #include<stdio.h> int fa[1000]; int find(int u) { return fa[u]==u?u:fa[u]=find(fa[u]); } int main() { int i,n,m,u,v,x,y; scanf("%d%d",&n,&m); while (n

[HDOJ1232]畅通工程(并查集)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1232 题目描述 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可).问最少还需要建设多少条道路? Input 测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是城镇数目N ( <

hdoj 1232 畅通工程

引述之类的就免了,我们现在做题碰到的并查集基础题目大都是连通城市(或者村庄学校),接下来我们就称每一个城市为一个元素.我们解决此类题目运用的是树结构,每个集合用一棵树表示,而树的节点用于存储集合中的元素名.举个实例:有A,B,C,D这4个城市,我们用树结构连通的形式如下: A | B | C | D 在这个树结构里面,A是根节点即没有父节点的节点,A是B的父节点,B是C的父节点,C是D的父节点,而且对于连通4个城市A,B,C,D的树结构来说它有且只有一个根节点(这也是判断城市是否全部连通的重要依

B - 畅通工程(并查集)

对并查集理解之后就可以做这种题了,虽说这种题做的不多,这道题做过才这么快搞定,可是还是挺happy滴,加油 Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可).问最少还需要建设多少条道路? Input 测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M:随后的M行对

ACM: 继续畅通工程-并查集-最小生成树-解题报告

继续畅通工程 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态.现请你编写程序,计算出全省畅通需要的最低成本. Input 测试输入包含若干测试用例

ACM: 畅通工程-并查集-解题报告

畅通工程 Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可).问最少还需要建设多少条道路? Input 测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是城镇数目N ( &l