PTA_21_08_图7 _公路村村通

题目描述

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

输入格式

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

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

输出格式

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

12

算法分析

本题采用的是最小生成树的算法,最小生成树主要分为普里姆算法(prim)和克鲁斯卡尔(Kruskal)算法。普里姆算法是以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树的。克鲁斯卡尔算法则是直接以边为目标进行构建的。因为权值实在边上,直接找最小权值的边来构建生成树是很自然的思想。

克鲁斯卡尔算法主要针对边来展开,在边数少的时候效率会非常高,所以对稀疏图具有很大的优势

普里姆算法对于稠密图,即边数非常多的情况会好一些。

因此我们将采用普里姆算法来构建最小生成树

利用邻接矩阵来存储各点的信息。

代码实现

#include<stdio.h>
#include<iostream>using namespace std;
#define MAXSIZE 20
#define INFINITY 65535
bool visited[MAXSIZE];struct CNode
{int numcity;int numroad;int arc[MAXSIZE][MAXSIZE];//存储连通的权重int city[MAXSIZE];
};typedef struct CNode* Cgraph;void CreateGraph(Cgraph graph)
{int i, j, k;int tmp_city, tmp_city2, tmp_weight;cin >> graph->numcity >> graph->numroad;for (i = 1; i <= graph->numcity; i++){for (j = 1; j <=graph->numcity; j++){if (i == j){graph->arc[i][j] = 0;}else{graph->arc[i][j] = INFINITY;}}}for (i = 1; i <= graph->numroad; i++){cin >> tmp_city >> tmp_city2 >> tmp_weight;graph->arc[tmp_city][tmp_city2] = tmp_weight;graph->arc[tmp_city2][tmp_city] = tmp_weight;}
}int minispantree_prim(Cgraph graph)
{int min, i, j, k;int costmoney = 0;int value[MAXSIZE];int adjvex[MAXSIZE];//保存相关顶点间边的权值点下标int lowcost[MAXSIZE];//保存相关顶点间边的权值lowcost[0] = 0;//初始化第一个权值为0adjvex[0] = 0;//初始化第一个顶点下标为0value[0] = 0;//保存到各点的最小权重visited[0] = true;//标志是否被访问过for (i = 2; i <= graph->numcity; i++)//循环除下标0外的全部顶点{lowcost[i - 1] = graph->arc[1][i];//v1顶点与指右边的权值存入数组adjvex[i-1] = 0;//初始化都为v0的下标}for (i = 2; i <= graph->numcity; i++){min = INFINITY;//初始化最小值权值为无穷,或则可以说是较大的数字j = 1;k = 0;while (j < graph->numcity){if (lowcost[j] != 0 && lowcost[j] < min)//如果权值不为0且权值小于min{min = lowcost[j];//则让当前权值成为最小值k = j;//将当前最小值的下标存入k中}j++;}value[i-1] = min;visited[k] = true;lowcost[k] = 0;//将当前顶点的权值设置为0,此顶点完成任务for (j = 0; j < graph->numcity; j++){if (lowcost[j] != 0 && graph->arc[k + 1][j + 1] < lowcost[j]){lowcost[j] = graph->arc[k + 1][j + 1];adjvex[j] = k;}}}for (i = 0; i < graph->numcity; i++){costmoney += value[i];if (!visited[i]){cout << "-1";return 0;}}cout << costmoney;}int main()
{Cgraph graph;graph = (Cgraph)malloc(sizeof(struct CNode));CreateGraph(graph);minispantree_prim(graph);
}

PTA_21_08_图7 _公路村村通相关推荐

  1. 7-10 公路村村通 (最小生成树Prim算法) | PTA数据结构与算法——C语言实现

    公路村村通 非常直白的最小生成树问题. 原题链接:PTA | 程序设计类实验辅助教学平台 题目描述 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通 ...

  2. PTA 公路村村通 思路分析及代码解析

    PTA 公路村村通 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) 三.具体实现 1. 弯路和bug 2 ...

  3. 浙大数据结构:08-图7 公路村村通 (30 分)Prim与Kruskal算法

    08-图7 公路村村通 (30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N( ...

  4. 5-10 公路村村通 (Kruskal+并查集)

    5-10 公路村村通 (30分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数NN(\ ...

  5. 2-1 公路村村通 (25 分)

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N) ...

  6. 7-3 公路村村通 (30分)含解析

    7-3 公路村村通 (30分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤10 ...

  7. 08-图7 公路村村通

    08-图7 公路村村通(30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤ ...

  8. 7-5 公路村村通 (30 分)(C语言实现)

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N) ...

  9. 08-图7 公路村村通(浙大数据结构)

    中国大学MOOC-陈越.何钦铭-数据结构-2022夏 08-图7 公路村村通 分数 30 作者 陈越 单位 浙江大学 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每 ...

最新文章

  1. Mysql5.7的gtid主从半同步复制和组复制
  2. 软考高项之沟通与干系人管理-背诵记忆
  3. 《java基础知识》Java变量作用域
  4. 5.13 卡尔曼滤波
  5. linux下永久添加静态路由
  6. OCR识别之图像预处理
  7. 微信小程序wepy框架资源汇总
  8. werkzeug.local
  9. Kubernetes学习总结(10)—— 何为云原生,与 kubernetes 是什么关系
  10. qint64转字符串
  11. android design library提供的TabLayout的用法
  12. oracle数据库自动备份控制文件的目录,16.5 控制文件的自动备份和还原(1)
  13. 微信小游戏 H5 排行榜源码
  14. (面试总结)您不清楚的18个非技术面试题---今天教你巧妙回答
  15. 基于java的智能手表_基于安卓Android智能手环(计步器)APP设计(含录像)
  16. Modown v7.3无限制版+ Erphpdown12.3插件 + 工单系统
  17. 浅谈JPA一:JPA是什么?
  18. 消息队列 RocketMQ应用场景之削峰填谷
  19. 蘑菇街2016校园招聘第一个编程题
  20. XiaoZi's CrackMe

热门文章

  1. java excel合并内容相同的单元格
  2. 基于蚁群算法的多配送中心的车辆调度问题的研究附Matlab代码
  3. 7-3 求n以内最大的k个素数以及它们的和
  4. 推荐官方开源 PInvoke 库 包含大量 win32 封装
  5. IM即时通讯系统架构
  6. Swing是一把刀(转载)
  7. OpenGL的矩阵变换详解——有图有真相
  8. 解决本地从 github上传或下载代码时每次都需要输入用户名和密码
  9. 手把手教你读财报----银行业---第十五课
  10. STM32 Simulink 自动代码生成电机控制——DTC控制仿真到代码生成