pta 编程题21 公路村村通
2024-09-12 10:00:24
其它pta数据结构编程题请参见:pta
这道题考察最小生成树问题,用的是Prim算法。
和Dijkstra算法相比,没有了collect数组,因为dist[v] == 0就代表v被已收录。
#include <iostream>
using namespace std; int N, M;
int** G;
void buildGraph();
void deleteGraph();
int prim();
int findMinDist(int dist[]); int main()
{
cin >> N >> M;
buildGraph();
cout << prim();
deleteGraph();
return ;
} void buildGraph()
{
int i, j;
G = new int*[N];
for (i = ; i < N; i++)
{
G[i] = new int[N];
for (j = ; j < N; j++)
G[i][j] = INT_MAX;
} int v, w, d;
for (i = ; i < M; i++)
{
cin >> v >> w >> d;
v--; w--;//输入从1计数
G[v][w] = d;
G[w][v] = d;
}
} void deleteGraph()
{
for (int i = ; i < N; i++)
delete[] G[i];
delete[] G;
} int findMinDist(int dist[])
{ /*返回未收录进MST的顶点中dist最小的顶点*/
int minV, v;
int minDist = INT_MAX;
for (v = ; v < N; v++)
{
if (dist[v] != && dist[v] < minDist)
{
minDist = dist[v];
minV = v;
}
}
if (minDist < INT_MAX)
return minV;
return -;
} int prim()
{ /*返回最小生成树的权重*/
int v, w, vCount = ;
int totalWeight = ;
int* dist = new int[N]; /*初始化,初始点下标为0*/
for (v = ; v < N; v++)
dist[v] = G[][v]; /*将0收进最小生成树MST*/
dist[] = ;
vCount++; while (true)
{
v = findMinDist(dist);
if (v == -)
break; totalWeight += dist[v];
dist[v] = ; //收录v
vCount++; for (w = ; w < N; w++)
{
/*如果w没有被收录*/
if (dist[w] != && G[v][w] < dist[w])
{
dist[w] = G[v][w];
}
}
} delete[] dist; if (vCount < N)
return -;
return totalWeight;
}
最新文章
- JavaScript模板引擎artTemplate.js——是否编码输出html字符
- 关于如何通过json更改背景图片
- 2014年物联网Internet of Things应用简介
- java中i=i++字节码分析
- [WebService] the namespace on the ";definitions"; element, is not a valid SOAP version
- CentOS 7安装Mysql并设置开机自启动
- ajax利用json进行服务器与客户端的通信
- ECC中的CRM UI端摆弄
- PhpStorm WebMatrix xDebug 配置开发环境
- My集合框架第一弹 LinkedList篇
- Java程序员的发展前景
- oracle AWR深入研究分析,如何使用
- [C#错误]	未找到类型或命名空间名称"; "; (是否缺少 using 指令或程序集引用?)
- JDK1.5-1.7的特性
- SSH命令行管理文件
- PythonStudy——流程控制 Process control
- Linux内核中_IO,_IOR,_IOW,_IOWR宏的用法
- 从零开始的Python学习Episode 18——面向对象(1)
- WIN8+VS2013编写发布WCF、一(编写)、二(部署)、三(调用)
- My97DatePicker日历控件在iframe提示没有权限的问