最小生成树Prim算法的简单应用-----08-图7 公路村村通 (30 分)

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。

输入格式:
输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。

输出格式:
输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出−1,表示需要建设更多公路。

输入样例:
6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3
结尾无空行
输出样例:
12

这题就是一道Prim算法的最小生成树问题
但是代码比较奇怪,一开始老是取N,M最大的时候通过不了,后来在主函数里面写了这么一行初始化代码之后又可以了

for(int i=1;i<=N;++i)
        for(int j=1;j<N;++j)
            A[i][j]=INF;//如果没有这个循环的话,最大N,M连通集无法得到正确答案
    //这个循环只有上面取<=N,下面取<N,才能全部通过,其他情况总是有测试用例无法通过

不知道为什么,迷迷糊糊的做出来了,还有就是如果用邻接矩阵存储而不是数组的话,这样初始化反而问题更多,但是不这样初始化的话最大的N,M总是通过不了,不知道为什么。
代码其实很简单,如下:

#include<iostream>
using namespace std;
const int MaxSize = 1001;
const int INF = 65536;
int A[MaxSize][MaxSize];
int N, M;
int Prim(int v)
{
   
	int ans = 0;
	int lowcost[MaxSize];//记录两个集合之间的最小边
	int MIN = INF;
	bool flag=false;//用来判断有没有找到最小边,如果没有则是false,直接输出-1
	int closest[MaxSize];
	int i, j, k;//colsest用来记录最小边在u中相应的顶点,其下标表示U-V中对应的
	//最小边的顶点
	for (i = 1;i <=N;++i)//初始化,初始时U中只有一个顶点v
	{
   //lowcost[i]表示这n个顶点到顶点v的距离,然后下一步再找最小距离即可,因为只有一个点v
		//所以集合之间最小距离就是到v的最小距离
		lowcost[i] = A[v][i];
		closest[i] = v;
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值