PTA 公路村村通 思路分析及代码解析
PTA 公路村村通
- 一、前导
- 1. 需要掌握的知识
- 2. 题目信息
- 二、解题思路分析
- 1. 题意理解
- 1. 1 输入数据
- 1.2 输出数据
- 2. 思路分析(重点)
- 三、具体实现
- 1. 弯路和bug
- 2. 代码框架(重点)
- 2.1 采用的数据结构
- 2.2 程序主体框架
- 2.3 各分支函数
- 3. 完整编码
- 四、参考
一、前导
1. 需要掌握的知识
- 最小生成树,Prim算法
2. 题目信息
- 题目来源:PTA / 拼题A
- 题目地址:公路村村通
二、解题思路分析
1. 题意理解
- 最小生成树问题
1. 1 输入数据
6 15 //城镇数目6个(图顶点)、候选道路数目15个(边)
1 2 5 //城镇编号、城镇编号、道路改建成本
1 3 3
4 5 10
4 6 8
5 6 3
1.2 输出数据
- 输出公路村村通需要的最低成本,即打印最小生成树的权重;若不存在MST,打印-1
2. 思路分析(重点)
- 最小生成树问题,可以用Prim算法解决,由于题目仅要求输出最小生成树的权重,并未要求打印最小生成树,对Prim算法进行适当调整即可AC
三、具体实现
1. 弯路和bug
- 按照Prim算法(避环法)实现即可
2. 代码框架(重点)
2.1 采用的数据结构
- 使用二维数组存储图:使用空间换解题时间,代码量会少很多
#define max 1001 //城市从1开始编号,最大值为1000
int Graph[max][max]; //方便起见 使用全局变量
int VertexNumber,EdgeNumber;
- 数组dist 和 parent配合Prim算法使用
int dist[max]; //dist数组表示顶点到MST的距离,0表示在MST中
int parent[max];//存储顶点的父结点
2.2 程序主体框架
程序伪码描述
int main()
{ 1.构建图2.执行Prim算法return 0;
}
2.3 各分支函数
- FindDistMin( ):找到dist数组中的最小值 且 该顶点未被收录到MST中
#define Null -1
#define maxWeight 99999
typedef int vertex;
vertex FindDistMin()
{vertex V=Null;int distMin=maxWeight;for(int i=1;i<=VertexNumber;i++){if(dist[i] && distMin>dist[i]) { // dist[i]=0 表示顶点i已收录进MST中distMin=dist[i];V=i;}}return V;
}
- Prim() :本题AC的核心函数。首先复习下Prim算法的步骤,由于本题仅需要计算MST的权值,因此不涉及MST的创建(包括边的插入),因此只需要使用Prim算法中的非边部分就可以AC本题
void Prim() //本题只要最小生成树权值,不需要建立MST
{vertex V,W;int vertexCount=0; //记录MST中的顶点数量,当MST中的顶点数 等于 图的顶点数时,MST才存在int MSTWeight=0; //记录MST的权值for(V=1;V<=VertexNumber;V++) //向 dist parent 两个数组赋初值 {parent[V]=Source;dist[V]=maxWeight; } dist[Source]=0; //首先将源点1收入MSTvertexCount++;parent[Source]=-1; //最先收入的顶点为MST的树根for(V=1;V<=VertexNumber;V++){ //收入一个顶点进MST,更新其邻接点的dist值if(Graph[Source][V])dist[V]=Graph[Source][V];}while(true){V=FindDistMin();if(V==Null) break; //所有顶点都已经收入MST 或 图不连通dist[V]=0; //按Prim算法,将dist最小的顶点收入MSTvertexCount++;MSTWeight += Graph[parent[V]][V]; //累计MST权重//将边加入MST的编码省略(边的两个端点 [parent[V]] [V]) for(W=1;W<=VertexNumber;W++) //更新V的邻接点W的dist值{if(dist[W]!=0 && Graph[V][W]!=0) //dist[W]!=0 说明还未收录入MST {if(Graph[V][W]<dist[W]) {dist[W]=Graph[V][W];parent[W]=V;}} }}if(vertexCount!=VertexNumber)cout<<Null;else cout<<MSTWeight;return;
}
3. 完整编码
- 本文如果对你有帮助,请点赞鼓励 ,谢谢
PTA 公路村村通 思路分析及代码解析相关推荐
- PTA 电话聊天狂人 思路分析及代码解析
PTA 电话聊天狂人 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析 三.具体实现 ...
- PTA 树的同构 思路分析及代码解析
PTA 树的同构 思路分析及代码解析 v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 2. 思路分析(重点) 三.具体实现 1. 弯路和bug 2. 代码框 ...
- PTA 旅游规划(邻接矩阵) 思路分析及代码解析
PTA 旅游规划 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) 三.具体实 ...
- PTA 旅游规划(邻接表) 思路分析及代码解析
PTA 旅游规划_使用邻接表 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) ...
- PTA 统计工龄 思路分析及代码解析
PTA 统计工龄 思路分析及代码解析v0.6 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析 三.具体实现 1. ...
- PTA 哈利·波特的考试 思路分析及代码解析
PTA 哈利·波特的考试 思路分析及代码解析v0.9.1 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) ...
- PTA QQ帐户的申请与登陆 思路分析及代码解析
PTA QQ帐户的申请与登陆 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析 三.具 ...
- PTA 公路村村通
7-10 公路村村通 (30分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1 ...
- PTA 公路村村通 (30 分)
7-3 公路村村通 (30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1 ...
最新文章
- 02 面向对象之:类空间问题以及类之间的关系
- Delphi 与 DirectX 之 DelphiX(33): TDIB.SmoothRotateWrap();
- NFS mount failed, reason given by server: Permission denied ---nfs挂载失败
- MVCC在MySQL的InnoDB中的实现
- 分布式监控之Zabbix-Server
- kubernetes高级之创建只读文件系统以及只读asp.net core容器
- dup/dup2函数的用法
- 六、Analysis of quicksort
- python sort 逆序_python实现·十大排序算法之插入排序(Insertion Sort)
- hadoop 如何连beeline_关于hadoop:将日期函数设置为变量并在beeline和hql文件中使用(hive)...
- linux清理缓存_[ERROR] Linux 的 No space left on device(磁盘空间不足)
- MMU页表的内存消耗
- dev c++调试怎么看变量的值_DevC++ 安装教程
- 关于CSDN怎么获得积分和C币的方法
- html flash轮播图,flash滚动图片制作 图片列表左右滚动轮播
- 分享十个在线听歌、免费下载无损音乐的网站
- C#操作Word(二)——将Word文档嵌入到WinForm窗体中
- Win10设置系统补丁更新服务器,win10如何关闭自动更新补丁_win10关闭自动更新补丁的图文教程...
- 程序员节的一点小感触
- vue3 baseCss 初始化
热门文章
- PTA 电话聊天狂人 思路分析及代码解析