数据结构系列内容的学习目录→\rightarrow→浙大版数据结构学习系列内容汇总。

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

  输入格式: 输入数据包括城镇数目正整数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

  代码实现:

  • 方法1:Kruskal算法
#include<iostream>
using namespace std;
#include<queue>
#include<vector> #define MaxVertex 1005
typedef int Vertex;
int N;  // 顶点
int M;  // 边
int parent[MaxVertex];   // 并查集
struct Node {Vertex v1;Vertex v2;int weight;// 重载运算符 bool operator < (const Node &a) const{return weight > a.weight;}
};
priority_queue<Node> q;  // 最小堆
vector<Node> MST; // 最小生成树
int sum;// 初始化图信息
void BuildGraph()
{Vertex v1, v2;int w;cin >> N >> M;for (int i = 1; i <= N; i++) {parent[i] = -1;}// 初始化点for (int i = 0; i < M; i++) {cin >> v1 >> v2 >> w;struct Node tmpE;tmpE.v1 = v1;tmpE.v2 = v2;tmpE.weight = w;q.push(tmpE);}sum = 0;
}//  路径压缩查找
int Find(int x)
{if (parent[x] < 0)return x;elsereturn parent[x] = Find(parent[x]);
}//  按秩归并
void Union(int x1, int x2)
{x1 = Find(x1);x2 = Find(x2);if (parent[x1] < parent[x2]) {parent[x1] += parent[x2];parent[x2] = x1;}else {parent[x2] += parent[x1];parent[x1] = x2;}
}void Kruskal()
{while (MST.size() != M - 1 && !q.empty()) {Node E = q.top();    // 最小堆,出队权重最小的 q.pop();if (Find(E.v1) != Find(E.v2))  // 判断是否属于同一集合 {sum += E.weight;Union(E.v1, E.v2);    // 并 MST.push_back(E);}}
}int main()
{BuildGraph();Kruskal();// 图连通 if (MST.size() == N - 1)cout << sum << endl;elsecout << -1 << endl;system("pause");return 0;
}

  测试: 输入样例的测试效果如下图所示。

  • 方法2:Prim算法
#include<iostream>
using namespace std;
#include<vector>#define Inf 100000
#define MaxSize 1001
int G[MaxSize][MaxSize];
int parent[MaxSize];
int dist[MaxSize];
int N;  // 顶点
int M;  // 边
int sum;
vector<int>MST;void BuildGraph()
{int v1, v2;int w;cin >> N >> M;for (int i = 1; i <= N; i++) {for (int j = 1; j <= N; j++) {G[i][j] = 0;}dist[i] = Inf;parent[i] = -1;}for (int i = 0; i < M; i++) {cin >> v1 >> v2 >> w;G[v1][v2] = w;G[v2][v1] = w;}
}void Init(int x)       //初始化第一个点和到周围点的距离
{dist[x] = 0;MST.push_back(x);for (int i = 1; i <= N; i++) {if (G[x][i]) {dist[i] = G[x][i];parent[i] = x;}}
}int FindMin()      //找点周围路径最短的点
{int min = Inf;int xb = -1;for (int i = 1; i <= N; i++) {if (dist[i] && dist[i] < min) {min = dist[i];xb = i;}}return xb;
}void Prim(int s)
{Init(s);while (1) {int v = FindMin();if (v == -1)       //不存在这样的点break;sum += dist[v];dist[v] = 0;MST.push_back(v);for (int i = 1; i <= N; i++) {if (G[v][i] && G[v][i] < dist[i]) {dist[i] = G[v][i];parent[i] = v;}}}
}int main()
{BuildGraph();Prim(1); if (MST.size() == N)cout << sum << endl;elsecout << -1 << endl;system("pause");return 0;
}

  测试: 输入样例的测试效果如下图所示。

数据结构(四)图 —— 编程作业 07 :公路村村通相关推荐

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

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

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

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

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

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

  4. PTA_21_08_图7 _公路村村通

    PTA_21_08_图7 _公路村村通 题目描述 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式 输入数据包括城镇数目 ...

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

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

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

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

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

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

  8. 5-10 公路村村通 (30分)

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

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

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

最新文章

  1. C# 调用C++ dll 返回char*调用方式(StringBuilder乱码)
  2. oracle中触发器的讲解
  3. php 执行效率,PHP 函数执行效率的小比较
  4. android的文件操作,Android文件操作概要1.ppt
  5. MyBatis多参数传递之Map方式示例——MyBatis学习笔记之十三
  6. ionic2开发的仿外卖点餐系统(Ionic2+Angular2
  7. 鸿蒙济判法讲义,2020-02-09《薛兆丰经济学讲义》读书笔记
  8. 关于Windows消息钩子的理解与测试项目
  9. java url 短链接_推荐几个官方腾讯短链接url接口(含PHP演示代码)
  10. 如何用“向上管理”搞垮一个团队?
  11. bzoj3390[Usaco2004 Dec]Bad Cowtractors牛的报复*
  12. 五月职场胜如火 Java讲座陪您过
  13. Mysql之INFORMATION_SCHEMA解析1
  14. Vue安装必要插件element-ui插件及axios依赖(详细)
  15. 服务器2003系统无故重启,2003服务器自动重启
  16. 简单案例:注册登录功能实现
  17. uni-app 第三方授权登录
  18. ai条码插件免安装_ai cs6条码插件 支持Illustrator cs6的条码生成脚本
  19. 夜神模拟器(Android7)+BurpSuit配置抓取HTTPS包
  20. ## 关于二阶振荡因子的伯德图的一些解读

热门文章

  1. LPC1788在外部RAM调试总结
  2. 图解 gma 气候标准化指数运算过程的数组变化流程:以 SPI 为例
  3. 机器学习基础 - [第四章:正则化](3)线性回归的正则化
  4. 计算机专业术语及其解释,计算机专业术语解释
  5. [附源码]java毕业设计石林县石漠化信息查询分析系统
  6. ubuntu 18.04 安装NVIDIA 显卡驱动
  7. 调优之网络调优-网卡绑定
  8. Swing是一把刀(转载)
  9. Liblinear库编译
  10. Mac 打印机 黑白