POJ2421题解(最小生成树)

题目翻译:

  • Description:
    有N个村庄,编号从1到N,您应该修建一些道路,以便每两个村庄可以相互连接。 我们说两个村庄A和B是连通的,当且仅当A和B之间有一条道路,或者存在一个村庄C使得A和C之间有一条道路,并且C和B连通时。
    我们知道,一些村庄之间已经存在一些道路,您的工作是建造一些道路,以使所有村庄都连接起来,并且所有道路的长度都应最小。
  • Iuput:
    第一行是整数N(3 <= N <= 100),它是村庄的数量。 然后是N行,其中第i个包含N个整数,而这N个整数中的第j个是村庄i与村庄j之间的距离(该距离应为[1,1000]之内的整数)。
    然后有一个整数Q(0 <= Q <= N *(N +1)/ 2)。 然后出现Q条线,每条线包含两个整数a和b(1 <= a <b <= N),这意味着已经建立了村庄a和村庄b之间的道路。
  • Output:
    您应该输出一条包含整数的线,该整数是要连接所有村庄的所有道路的长度,并且该值是最小值。

题目分析:

这个题其实就是最小生成树的题目,让你把N个点联通所需要的最小代价对吧,只不过特别的是已经给你联通好了一部分,那就将距离设成0即可。附上代码:
在这里插入图片描述

#include<iostream>
using namespace std;
int map[101][101] = { 0 };
int flag[101] = { 0 };
int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{	
		for (int j = 0; j < n; j++)
			cin >> map[i + 1][j + 1];
	}
	int m;
	cin >> m;
	for (int i = 0; i < m; i++)
	{
		int a, b;
		cin >> a >> b;
		map[a][b] = 0;
		map[b][a] = 0;
	}
	int cnt = 1; int ans = 0;
	while (cnt == 1)
	{	
		int min = 1e8; int sub = 101; cnt = 0;
		for (int i = 2; i <= n; i++)
		{	
			if (flag[i]==0&&map[1][i] < min)
			{
				min = map[1][i];
				sub = i;
				cnt = 1;
			}
		}
		ans += min;
		map[1][sub] = 0;
		flag[sub] = 1;
		for (int i = 2; i <= n; i++)
		{
			if (map[sub][i] < map[1][i])
			{
				map[1][i] = map[sub][i];
			}
		}
	}
	cout << ans-1e8;
	return 0;
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeUltraLab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值