C - 畅通工程 (HDU - 1863)

- 题目大意

省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。因此求出最少的成本为多少?

- 解题思路

最小生成树的问题,用kruskal算法,kruskal算法是一种贪心策略,每次放长度(本题可以看做是建路的成本)最小的边,如果两个点属于同一个集合就不放,否则会构成环,每放一个点我们记录一次,最后把所有点都连通了就结束算法。

- 代码

#include<iostream>
#include<algorithm>
using namespace std;
const int MAX = 1e5 + 50;
int fa[MAX];

struct Edge {
	int u, v, w;
	bool operator<(const Edge &rhs)const {
		return w < rhs.w;
	}
}e[MAX];
void init(int n)
{
	for (int i = 1; i <= n; i++)
		fa[i] = i;
}

int find(int x)
{
	if (x == fa[x])
		return x;
	else
	{
		return fa[x] = find(fa[x]);
	}
}

bool Union(int x, int y)
{
	int fx = find(x), fy = find(y);
	if (fx == fy)
		return false;
	else
	{
		fa[fx] = fy;
		return true;
	}
}

int kruskal(int n, int m)
{
	sort(e, e + m);
	init(n);
	int sum = 0;
	for (int i = 1; i <= m; i++)
	{
		int u = e[i].u, v = e[i].v, w = e[i].w;
		if (Union(u, v))
		{
			sum += w;
		}
	}
	return sum;
}
int main()
{
	int n,m,tmp,sum;
	while (cin >> n >> m)
	{
		if (n == 0)
			break;
		for (int i = 1; i <= n; i++)
			cin >> e[i].u >> e[i].v >> e[i].w;
		tmp = kruskal(m, n);
		sum = 0;
		for (int i = 1; i <= m; i++)
		{
			if (fa[i] == i)
				sum++;
		}
		if (sum > 1)
			cout << "?" << endl;
		else
		{
			cout << tmp << endl;
		}
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/alpacadh/p/8449433.html

时间: 2024-08-02 01:06:29

C - 畅通工程 (HDU - 1863)的相关文章

HDU - 1232 畅通工程 HDU - 1874畅通工程续 HDU - 1875畅通工程再续

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1232 题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1875 畅通工程属于水题,直接用并查集就行,加个路径压缩那就更好. 畅通工程续这道题WA了N次,因为有一个地方没注意到就是一个城镇到另外一个城镇的有多条道路, 所以你一开始就要把最短的道路选出来.

L - 还是畅通工程 - hdu 1233

Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小.请计算最小的公路总长度. Input 测试输入包含若干测试用例.每个测试用例的第1行给出村庄数目N ( < 100 ):随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离.为简单起见,村庄从1到N编号. 当N

B - 畅通工程 (HDU - 1232)

- 题目大意 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可).问最少还需要建设多少条道路? - 解题思路 运用并查集的知识可以很容易做出.初始化时每个城镇都没有路,所以要连接的路的数量为n-1个,之后在增加路的过程中,先用并查集搜索,如果两个城镇确实不在一个集合,这条路就有用,两个城镇归为一个集合中,要连接的路减一.如果两个城镇之前就已

【还是畅通工程 HDU - 1233】【Kruskal模板题】

Kruskal算法讲解 该部分内容全部摘录自刘汝佳的<算法竞赛入门经典> Kruskal算法的第一步是给所有边按照从小到大的顺序排列. 这一步可以直接使用库函数 qsort或者sort. 接下来从小到大依次考查每条边(u,v). 情况1: u和v在同一个连通分量中, 那么加入(u, v)后会形成环, 因此不能选择. 情况2: 如果u和v在不同的连通分量, 那么加入(u, v)一定是最优的. 为什么呢? 下面用 反证法--如果不加这条边能得到一个最优解T, 则T+(u, v)一定有且只有一个环,

还是畅通工程 HDU - 1233

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=110; int p[N],n,m,ans,num; struct node { int a,b,w; }e[10005]; bool cmp(node a, node b) { return a.w < b.w; } int find(in

HDU 1863 畅通工程 (最小生成树)

Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本.现请你编写程序,计算出全省畅通需要的最低成本. Input 测试输入包含若干测试用例.每个测试用例的第1行给出评估的道路条数 N.村庄数目M ( < 100 ):随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间

HDU 1863 畅通工程【最小生成树,Prime算法+Kuruskal算法】

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

&lt;hdu - 1863&gt; 畅通工程 并查集和最小生成树问题

本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863  Problem Description: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本.现请你编写程序,计算出全省畅通需要的最低成本.  Input: 测试输入包含若干测试用例.每个测试用例的第1行给出评估的道路条数 N.村庄数目M ( < 100

HDU 1863:畅通工程(带权值的并查集)

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