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 ...
随机推荐
- Note:目录1
ylbtech-Note:目录1 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:http://ylbtech ...
- web接口开发基础知识-什么是web接口?
比如我们访问百度的首页,输入的url地址是:https://www.baidu.com/ 那么当我们在浏览器地址栏中输入url,敲回车后,发生了什么事情?怎么就能通过1个url地址就能看到百度的首页了 ...
- 001-notepad++下载安装、添加右键
一.下载 1.1.下载地址:https://notepad-plus-plus.org/ 一般下载 /1.2 1.2.解压至指定路径下即可 1.3.注册表添加鼠标右键 添加鼠标右键, 保存成reg执行 ...
- ajax总结及案例
一.实验简介 目的:检验输入登录名在数据库中是否存在,如果存在,当鼠标移出登录名框后,会提示用户名已存在,并且鼠标指针自动回到登录名框内. 操作步骤: 1.获取登录名的值 2.根据获取的登录名,组织查 ...
- sql 为什么要用where 1=1?
之前一直不太明白,sql语句里为什么要写where 1=1 提升某种执行效率? 其实,1=1 是永恒成立的,意思无条件的,也就是说在SQL语句中有没有这个1=1都可以. 这个1=1常用于应用程序根据用 ...
- SEC3 - MySQL常见命令
1.查看当前所有的数据库 show databases; 2. 打开指定的库名 use 库名称: 3.查看当前库中所有的表 show tables; 4. 查看其他库的所有表 show tables ...
- php的优势与缺点
PHP即“超文本预处理器”,是一种通用开源脚本语言.PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言.PHP独特的语法混合了C.Java.Perl以及 PHP 自创的语法.利于学习 ...
- Angular 输入中的禁止特定输入值--Validator 与 Directive 实现
1 前言 最近在项目中涉及表单的情况下,需要对用户输入进行过滤,比如填写用户名的时候不可以使用空格或者特殊符号,这里有几个解决方法: 使用 Angular 的正则同步验证器 使用 RxJS对输入的值进 ...
- Linux系统配置Java开发基本环境
jdk安装一.用yum安装jdk1.查看yum库都有哪些jdk版本yum search java|grep jdk2.选择版本安装yum install java-1.8.0-openjdk(/usr ...
- Day8---Python的字典类型及操作
字典类 1.生成方法: a.介绍: 字典是键值对的集合,键值对 : 键是数据索引的扩展 b.生成方法: 使用{} 或者 dict() a = {'a' = 1, 'b' = 2, 'c' = 3 ...