PTA 公路村村通

  • 一、前导
    • 1. 需要掌握的知识
    • 2. 题目信息
  • 二、解题思路分析
    • 1. 题意理解
      • 1. 1 输入数据
      • 1.2 输出数据
    • 2. 思路分析(重点)
  • 三、具体实现
    • 1. 弯路和bug
    • 2. 代码框架(重点)
      • 2.1 采用的数据结构
      • 2.2 程序主体框架
      • 2.3 各分支函数
    • 3. 完整编码
  • 四、参考

一、前导

1. 需要掌握的知识

  1. 最小生成树,Prim算法

2. 题目信息

  1. 题目来源:PTA / 拼题A
  2. 题目地址:公路村村通

二、解题思路分析

1. 题意理解

  1. 最小生成树问题

1. 1 输入数据

6 15   //城镇数目6个(图顶点)、候选道路数目15个(边)
1 2 5 //城镇编号、城镇编号、道路改建成本
1 3 3
4 5 10
4 6 8
5 6 3

1.2 输出数据

  1. 输出公路村村通需要的最低成本,即打印最小生成树的权重;若不存在MST,打印-1

2. 思路分析(重点)

  1. 最小生成树问题,可以用Prim算法解决,由于题目仅要求输出最小生成树的权重,并未要求打印最小生成树,对Prim算法进行适当调整即可AC

三、具体实现

1. 弯路和bug

  1. 按照Prim算法(避环法)实现即可

2. 代码框架(重点)

2.1 采用的数据结构

  1. 使用二维数组存储图:使用空间换解题时间,代码量会少很多
#define max 1001 //城市从1开始编号,最大值为1000
int Graph[max][max]; //方便起见 使用全局变量
int VertexNumber,EdgeNumber;
  1. 数组dist 和 parent配合Prim算法使用
int dist[max]; //dist数组表示顶点到MST的距离,0表示在MST中
int parent[max];//存储顶点的父结点

2.2 程序主体框架

               程序伪码描述
int main()
{   1.构建图2.执行Prim算法return 0;
}

2.3 各分支函数

  1. 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;
}
  1. 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. 完整编码

  1. 本文如果对你有帮助,请点赞鼓励 ,谢谢

    PTA 公路村村通 思路分析及代码解析相关推荐

    1. PTA 电话聊天狂人 思路分析及代码解析

      PTA 电话聊天狂人 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析 三.具体实现 ...

    2. PTA 树的同构 思路分析及代码解析

      PTA 树的同构 思路分析及代码解析 v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 2. 思路分析(重点) 三.具体实现 1. 弯路和bug 2. 代码框 ...

    3. PTA 旅游规划(邻接矩阵) 思路分析及代码解析

      PTA 旅游规划 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) 三.具体实 ...

    4. PTA 旅游规划(邻接表) 思路分析及代码解析

      PTA 旅游规划_使用邻接表 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) ...

    5. PTA 统计工龄 思路分析及代码解析

      PTA 统计工龄 思路分析及代码解析v0.6 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析 三.具体实现 1. ...

    6. PTA 哈利·波特的考试 思路分析及代码解析

      PTA 哈利·波特的考试 思路分析及代码解析v0.9.1 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) ...

    7. PTA QQ帐户的申请与登陆 思路分析及代码解析

      PTA QQ帐户的申请与登陆 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析 三.具 ...

    8. PTA 公路村村通

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

    9. PTA 公路村村通 (30 分)

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

    最新文章

    1. 02 面向对象之:类空间问题以及类之间的关系
    2. Delphi 与 DirectX 之 DelphiX(33): TDIB.SmoothRotateWrap();
    3. NFS mount failed, reason given by server: Permission denied ---nfs挂载失败
    4. MVCC在MySQL的InnoDB中的实现
    5. 分布式监控之Zabbix-Server
    6. kubernetes高级之创建只读文件系统以及只读asp.net core容器
    7. dup/dup2函数的用法
    8. 六、Analysis of quicksort
    9. python sort 逆序_python实现·十大排序算法之插入排序(Insertion Sort)
    10. hadoop 如何连beeline_关于hadoop:将日期函数设置为变量并在beeline和hql文件中使用(hive)...
    11. linux清理缓存_[ERROR] Linux 的 No space left on device(磁盘空间不足)
    12. MMU页表的内存消耗
    13. dev c++调试怎么看变量的值_DevC++ 安装教程
    14. 关于CSDN怎么获得积分和C币的方法
    15. html flash轮播图,flash滚动图片制作 图片列表左右滚动轮播
    16. 分享十个在线听歌、免费下载无损音乐的网站
    17. C#操作Word(二)——将Word文档嵌入到WinForm窗体中
    18. Win10设置系统补丁更新服务器,win10如何关闭自动更新补丁_win10关闭自动更新补丁的图文教程...
    19. 程序员节的一点小感触
    20. vue3 baseCss 初始化

    热门文章

    1. 共享电商即共享商圈的背后: 共创、共生、共享、共富,共赢的共富精神
    2. 基于WF4.0的公文管理系统
    3. 聊聊如何建设团队的创新氛围
    4. gitbook生成pdf时缺少ebook.css解决方案
    5. Manifest文件详解
    6. 协和谬误:欲罢不能的困局(博弈论的诡计)
    7. SWPU Python123作业题汇总(持续更新)
    8. 读取NTU-RGB-D数据集并利用关节信息生成gif
    9. java.lang.NoClassDefFoundError: Could not initialize class错误原因
    10. 微盟PK有赞,谁更胜一筹?