HDU ACM 1232 畅通工程->并查集

分析:

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

#include<iostream>
using namespace std;

int p[1001];

bool Init(int n)                //一开始指向自己
{
	for(int i=0;i<=n;i++)
		p[i]=i;
	return true;
}

int Find(int x)            //找到根节点
{
	int r,i,j;

	r=x;
	while(r!=p[r]) r=p[r];      //路径压缩准备,找到根节点

	i=x;
	while(i!=p[i])
	{
		j=p[i];
		p[i]=r;
		i=j;
	}
	return i;                 //返回根节点
}

bool Merge(int x,int y)      //返回是否需要合并
{
	int tx,ty;

	tx=Find(x);
	ty=Find(y);

	if(tx==ty) return false;
	p[tx]=ty;
	return true;
}

int main()
{
	int N,M,i,a,b,total;

	while(scanf("%d",&N))
	{
		if(N==0) break;
		scanf("%d",&M);

		total=N-1;         //一开始都没连通,最少需要修N-1条路才能把N个城市连接起来
		Init(N
			);
		for(i=0;i<M;i++)
		{
			scanf("%d%d",&a,&b);

			if(Find(a)!=Find(b))  //如果不连通,就把它连起来,还需修路就减一
			{
				Merge(Find(a),Find(b));
				total--;
			}
<span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; background-color: rgb(238, 238, 238);">                              //如果两点已经连通,那么这条路只是在图上增加了一个环,对连通性没有影响,忽略。</span>
		}
		printf("%d\n",total);
	}
    return 0;
}
时间: 2024-10-09 02:13:23

HDU ACM 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 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有

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 ( <

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

HDU ACM : 1875 畅通工程再续-&gt;最小生成树(并查集)

解析:最小生成树:Kruskal 算法:并查集实现. 1.首先找出符合要求的边: 2.对找出的边排序: 3.并查集找出n-1条边,无法修通n-1条路则无法实现要求. #include<iostream> #include<cmath> #include<algorithm> using namespace std; struct Point { int x,y; } point[102]; struct Edge { int a,b; double v; bool op

hdu 1863 畅通工程 (并查集+最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17593    Accepted Submission(s): 7417 Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交

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

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

hdu 1863 畅通工程 (并查集 、 kruskal)

畅通工程Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 37969    Accepted Submission(s): 16915 Problem Description省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有

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

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