08-图7 公路村村通(30 分)Prim
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。
输入格式:
输入数据包括城镇数目正整数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
我的答案
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> #define ERROR -1
#define false 0
#define true 1
#define MaxVertexNum 10000
#define INFINITY 65535
typedef int Vertex;
typedef int WeightType;
typedef int bool; //边
typedef struct ENode *PtrToENode;
struct ENode {
Vertex V1, V2;
WeightType Weight;
};
typedef PtrToENode Edge; //邻接矩阵
typedef struct GNode *PtrToGNode;
struct GNode {
int Nv;
int Ne;
WeightType G[MaxVertexNum][MaxVertexNum];
};
typedef PtrToGNode MGraph; //邻接点
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode {
Vertex AdjV;
WeightType Weight;
PtrToAdjVNode Next;
}; typedef struct VNode {
PtrToAdjVNode FirstEdge;
// DataType Data;
}AdjList[MaxVertexNum]; typedef struct LNode *PtrToLNode;
struct LNode {
int Nv;
int Ne;
AdjList G;
};
typedef PtrToLNode LGraph; //邻接矩阵
MGraph MGraphCreate(int VertexNum)
{
Vertex V, W;
MGraph Graph; Graph = (MGraph)malloc(sizeof(struct GNode));
Graph->Nv = VertexNum;
Graph->Ne = ; for(V=;V<Graph->Nv;V++) {
for(W=;W<Graph->Nv;W++) {
Graph->G[V][W] = INFINITY;
}
} return Graph;
} void MGraphInsertEdge(MGraph Graph, Edge E)
{
Graph->G[E->V1][E->V2] = E->Weight;
Graph->G[E->V2][E->V1] = E->Weight;
} MGraph MGraphBuild()
{
MGraph Graph;
Edge E;
int i, Nv; scanf("%d ", &Nv);
Graph = MGraphCreate(Nv); scanf("%d\n", &(Graph->Ne));
if(Graph->Ne != ) {
E = (Edge)malloc(sizeof(struct ENode));
for(i=;i<Graph->Ne;i++) {
scanf("%d %d %d\n", &E->V1, &E->V2, &E->Weight);
E->V1--;
E->V2--;
MGraphInsertEdge(Graph, E);
}
} return Graph;
} void MGraphPrint(MGraph Graph)
{
Vertex V, W;
printf("Graph:\n");
for(V=;V<Graph->Nv;V++) {
for(W=;W<Graph->Nv;W++)
printf("[%5d]\t" , Graph->G[V][W]);
printf("\n");
}
printf("-----------------------\n");
} //邻接表
LGraph LGraphCreate(int VertexNum)
{
Vertex V;
LGraph Graph; Graph = (LGraph)malloc(sizeof(struct LNode));
Graph->Nv = VertexNum;
Graph->Ne = ;
for(V=;V<Graph->Nv;V++)
Graph->G[V].FirstEdge = NULL; return Graph;
} void LGraphInsertEdge(LGraph Graph, Edge E)
{
PtrToAdjVNode NewNode; NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode->AdjV = E->V2;
NewNode->Weight = E->Weight; NewNode->Next = Graph->G[E->V1].FirstEdge;
Graph->G[E->V1].FirstEdge = NewNode; NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode->AdjV = E->V1;
NewNode->Weight = E->Weight; NewNode->Next = Graph->G[E->V2].FirstEdge;
Graph->G[E->V2].FirstEdge = NewNode;
} LGraph LGraphBuilGraph()
{
LGraph Graph;
Edge E;
// Vertex V;
int Nv, i; scanf("%d", &Nv);
Graph = LGraphCreate(Nv); scanf("%d", &(Graph->Ne));
if(Graph->Ne != ) {
E = (Edge)malloc(sizeof(struct ENode));
for(i=;i<Graph->Ne;i++) {
scanf("%d %d %d", &E->V1, &E->V2, &E->Weight);
LGraphInsertEdge(Graph, E);
}
} return Graph;
} Vertex FindMinDist(MGraph Graph, WeightType dist[])
{
Vertex MinV, V;
WeightType MinDist = INFINITY; for(V=;V<Graph->Nv;V++) {
if(dist[V] != && dist[V] < MinDist) {
MinDist = dist[V];
MinV = V;
}
}
if(MinDist < INFINITY)
return MinV;
else return ERROR;
} int Prim(MGraph Graph, LGraph MST)
{ /* 将最小生成树保存为邻接表存储的图MST,返回最小权重和 */
WeightType dist[MaxVertexNum], TotalWeight;
Vertex parent[MaxVertexNum], V, W;
int VCount;
Edge E; /* 初始化,默认初始点下标是0 */
for(V=;V<Graph->Nv;V++) {
/* 这里假设若V到W没有直接的边,则Graph->G[V][W]定义为INIFINITY */
dist[V] = Graph->G[][V];
parent[V] = ; /* 暂且定义所有顶点的父结点都是初始点0 */
}
TotalWeight = ; /* 初始化权重和 */
VCount = ; /* 初始化收录的顶点数 */
/* 创建包含所有顶点但没有边的图。注意用邻接表版本 */
MST = LGraphCreate(Graph->Nv);
E = (Edge)malloc(sizeof(struct ENode)); /* 将初始点0收录进MST */
dist[] = ;
VCount++;
parent[] = -; /* 当前树根是0 */ while() {
V = FindMinDist(Graph, dist);
/* V = 未被收录顶点中dist最小者 */
if(V == ERROR) /* 若这样的V不存在 */
break; /* 算法结束 */ /* 将V及相应的边<parent[V], V>收录进MST */
E->V1 = parent[V];
E->V2 = V;
E->Weight = dist[V];
LGraphInsertEdge(MST, E);
TotalWeight += dist[V];
dist[V] = ;
VCount++; for(W=;W<Graph->Nv;W++) { /* 对图中的每个顶点W */
if(dist[W]!= && Graph->G[V][W]<INFINITY) {
/* 若W是V的邻接点并且未被收录 */
if(Graph->G[V][W] < dist[W]) {
/* 若收录V使得dist[W]变小 */
dist[W] = Graph->G[V][W]; /* 更新dist[W] */
parent[W] = V; /* 更新树 */
}
}
}
}
if(VCount < Graph->Nv) /* MST中收的顶点不到|V|个 */
TotalWeight = ERROR;
return TotalWeight; /* 算法执行完毕,返回最小权重和或错误标记 */
} int main()
{
MGraph Graph;
LGraph Lraph;
WeightType minCost;
Graph = MGraphBuild();
// MGraphPrint(Graph);
minCost = Prim(Graph, Lraph);
printf("%d\n", minCost);
return ;
}
08-图7 公路村村通(30 分)Prim的更多相关文章
- pta08-图7 公路村村通 (30分)
08-图7 公路村村通 (30分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N ...
- PTA 7-1 公路村村通 (30分)
PTA 7-1 公路村村通 (30分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N ...
- PTA 08-图7 公路村村通 (30分)
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数NN(\le 1000≤1000)和候选道 ...
- 7-6 公路村村通(30 分) 【prime】
7-6 公路村村通(30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤10 ...
- 7-10 公路村村通(30 分)(最小生成树Prim算法)
7-10 公路村村通(30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1 ...
- pat06-图6. 公路村村通(30)
06-图6. 公路村村通(30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的 ...
- ACM程序设计选修课——Problem E:(ds:图)公路村村通(Prim)
问题 E: (ds:图)公路村村通 时间限制: 1 Sec 内存限制: 128 MB 提交: 9 解决: 5 题目描述 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本, ...
- PAT 7-14 公路村村通
https://pintia.cn/problem-sets/1111189748004499456/problems/1111189831248850957 现有村落间道路的统计数据表中,列出了有可 ...
- ACM程序设计选修课——Problem E:(ds:图)公路村村通(优先队列或sort+克鲁斯卡尔+并查集优化)
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
随机推荐
- pve之命令
pvesr list ha-manager status pvecm nodes pvecm status pveperf qm list root@cu-pve06:~# pvesr list Jo ...
- Python中import的使用方法
源文出处: "import"的本质参照: Python中import机制 python导入自定义模块和包
- Delphi中Tlist实例
http://blog.163.com/jiandande3218@126/blog/static/74728469201132721428194/ Delphi中Tlist实例 2011-04-27 ...
- Vagrant 入门 - 网络
原文地址 现在,我们启动了 web 服务器,并且通过同步目录使用宿主机上的文件提供服务.然而,还只能通过虚拟机中的终端访问服务器.这一章节中,我们会使用 Vagrant 的网络特性,配置 Vagran ...
- (转)Linux下编译安装log4cxx
Linux下编译安装log4cxx 一个项目的服务器端在Linux平台下,用到了开源日志库log4cxx,这个库是apache项目的一个子库.功能很不错.下面记录下它的编译和安装过程. log4cxx ...
- 机器学习 coursera_ML
在开始看之前,浏览器一直出现缓冲问题,是配置文件设置的不对,最后搞定,高兴!解决方法如下: 1.到C:\Windows\System32\drivers\etc下找到host文件,并以文本方式打开, ...
- MySQL-第N篇杂记
1.数据的导入导出 2.查询结果的重定向 3.ON DUPLICATE KEY UPDATE对于指定的主键或者唯一键,insert时发生冲突则进行update操作. 4.解决MySQL中问乱码问题,分 ...
- (vue.js)axios interceptors 拦截器中添加headers 属性
(vue.js)axios interceptors 拦截器中添加headers 属性:http://www.codes51.com/itwd/4282111.html 问题: (vue.js)axi ...
- 《剑指offer》面试题8 旋转数组的最小数字 Java版
(找递增排序旋转数组中的最小数字) 书中方法:这种题目就是要寻找数组的特点,然后根据这个特点去写.旋转后的递增数组分为两段递增序列,我们找到中点,如果比第一个元素大,表示在第一段递增序列里,如果比第一 ...
- spark连接hive找不到table
Caused by: org.apache.spark.sql.catalyst.analysis.NoSuchTableException: Table or view 'xxxx' not fou ...