PTA数据结构与算法题目集(中文)  7-10

7-10 公路村村通 (30 分)
 

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。

输入格式:

输入数据包括城镇数目正整数N(≤)和候选道路数目M(≤);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。

输出格式:

输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出−,表示需要建设更多公路。

输入样例:

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

题目分析:一道图的最小生成树算法的基础题 利用Prim或Kruskal算法来解决最小生成树问题 稠密图用Prim算法 稀疏图使用Kruskal算法 注意收录顶点在找到后就立刻进行 这样就不会对对角线上的元素进行判断
 #define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MAXVERTEXNUM 1000
#define INIFITY 65535 typedef struct ENode* Edge;
struct ENode
{
int V1, V2;
int Weight;
}; typedef struct GNode* Graph;
struct GNode
{
int Nv;
int Ne;
int G[MAXVERTEXNUM][MAXVERTEXNUM];
}; Graph BuildGraph(int VertexNum)
{
Graph Gra = (Graph)malloc(sizeof(struct GNode));
Gra->Nv = VertexNum;
Gra->Ne = ;
for(int i=;i<=Gra->Nv;i++)
for (int j = ; j <=Gra->Nv; j++)
{
if (i == j)
Gra->G[i][j] = ;
else
Gra->G[i][j] = INIFITY;
}
return Gra;
} void Insert(Edge E, Graph Gra)
{
Gra->G[E->V1][E->V2] = E->Weight;
Gra->G[E->V2][E->V1] = E->Weight;
} Graph CreateGraph()
{
int N, M;
scanf("%d%d", &N, &M);
Edge E = (Edge)malloc(sizeof(struct GNode));
Graph Gra = BuildGraph(N);
Gra->Ne = M;
for (int i = ; i < M; i++)
{
scanf("%d%d%d", &(E->V1), &(E->V2), &(E->Weight));
Insert(E, Gra);
}
return Gra;
} int IsEdge(Graph Gra, int V, int W)
{
return Gra->G[V][W] < INIFITY;
} int Dist[MAXVERTEXNUM];
int Path[MAXVERTEXNUM];
int Collected[MAXVERTEXNUM];
int Sum;
int FindMin(Graph Gra)
{
int MinDist = INIFITY;
int Min = -;
for (int i = ; i <=Gra->Nv; i++)
if (!Collected[i] && Dist[i] < MinDist)
{
MinDist = Dist[i];
Min = i;
}
return Min;
}
void Prim(Graph Gra,int V)
{
Dist[V] = ;
Path[V] = -;
Collected[V] = ;
for (int i = ; i <= Gra->Nv; i++)
{
Dist[i] = Gra->G[V][i];
Path[i] = V;
}
while ()
{
int Min = FindMin(Gra);
if (Min ==-)
break;
Collected[Min] = ;
Dist[Min] = ;
Sum += Gra->G[Path[Min]][Min];
for (int i = ; i <=Gra->Nv; i++)
{
if (!Collected[i] && IsEdge(Gra, Min, i))
if (Gra->G[Min][i] < Dist[i])
{
Dist[i] = Gra->G[Min][i];
Path[i] = Min;
}
}
}
} int main()
{
Graph Gra = CreateGraph();
Prim(Gra,);
int Flag =;
for (int i = ; i <= Gra->Nv; i++)
if (!Collected[i])
Flag = ;
if (Flag)
printf("%d", Sum);
else
printf("-1");
return ;
}

PTA数据结构与算法题目集(中文) 7-10的更多相关文章

  1. PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)

    PTA数据结构与算法题目集(中文)  7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分)   给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义 ...

  2. PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分)

    PTA数据结构与算法题目集(中文)  7-42整型关键字的散列映射 (25 分) 7-42 整型关键字的散列映射 (25 分)   给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射 ...

  3. PTA数据结构与算法题目集(中文) 7-41PAT排名汇总 (25 分)

    PTA数据结构与算法题目集(中文)  7-41PAT排名汇总 (25 分) 7-41 PAT排名汇总 (25 分)   计算机程序设计能力考试(Programming Ability Test,简称P ...

  4. PTA数据结构与算法题目集(中文) 7-40奥运排行榜 (25 分)

    PTA数据结构与算法题目集(中文)  7-40奥运排行榜 (25 分) 7-40 奥运排行榜 (25 分)   每年奥运会各大媒体都会公布一个排行榜,但是细心的读者发现,不同国家的排行榜略有不同.比如 ...

  5. PTA数据结构与算法题目集(中文) 7-39魔法优惠券 (25 分)

    PTA数据结构与算法题目集(中文)  7-39魔法优惠券 (25 分) 7-39 魔法优惠券 (25 分)   在火星上有个魔法商店,提供魔法优惠券.每个优惠劵上印有一个整数面值K,表示若你在购买某商 ...

  6. PTA数据结构与算法题目集(中文) 7-38寻找大富翁 (25 分)

    PTA数据结构与算法题目集(中文)  7-38寻找大富翁 (25 分) 7-38 寻找大富翁 (25 分)   胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人.假 ...

  7. PTA数据结构与算法题目集(中文) 7-37 模拟EXCEL排序 (25 分)

    PTA数据结构与算法题目集(中文)  7-37 模拟EXCEL排序 (25 分) 7-37 模拟EXCEL排序 (25 分)   Excel可以对一组纪录按任意指定列排序.现请编写程序实现类似功能. ...

  8. PTA数据结构与算法题目集(中文) 7-36 社交网络图中结点的“重要性”计算 (30 分)

    PTA数据结构与算法题目集(中文)  7-36 社交网络图中结点的“重要性”计算 (30 分) 7-36 社交网络图中结点的“重要性”计算 (30 分)   在社交网络中,个人或单位(结点)之间通过某 ...

  9. PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)

    PTA数据结构与算法题目集(中文)  7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市 ...

  10. PTA数据结构与算法题目集(中文) 7-34

    PTA数据结构与算法题目集(中文)  7-34 7-34 任务调度的合理性 (25 分)   假定一个工程项目由一组子任务构成,子任务之间有的可以并行执行,有的必须在完成了其它一些子任务后才能执行.“ ...

随机推荐

  1. 第一篇博客 C+++知识点总结一

    1.成员 1.比较特殊的成员类型:protected. 保护成员在本类中和private类型的成员作用一模一样.区别在于保护成员可以由本类的派生类的成员函数访问,但是私有成员在其派生类中无法访问. 2 ...

  2. python学习-练习题9*9乘法表巩固

    9*9乘法表 分析: 1X1为一行 1X2 2X2 为一行 for i in range(1,10): for j in range(1,i+1): print(str(i) + 'X' + str( ...

  3. 有关于python内置函数exec和eval一些见解笔记

    eval是将函数内的字符串以计算式的方式进行计算并给与外部一个值. 例: a=eval('1+1') print(a) >>>>2 但是如果出现在函数内部字符串中进行赋值会抛出 ...

  4. 数据挖掘入门系列教程(四)之基于scikit-lean实现决策树

    目录 数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris 加载数据集 数据特征 训练 随机森林 调参工程师 结尾 数据挖掘入门系列教程(四)之基于scikit-lean决策树处理 ...

  5. Core + Vue 后台管理基础框架1——运行系统

    1.down源码 git clone https://github.com/KINGGUOKUN/SystemManagement.git,项目目录如下: 2.还原数据库 找到项目根目录下System ...

  6. js 行走的小女孩 面向对象

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. js 模拟滚动条

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. (转)协议森林14 逆袭 (CIDR与NAT)

    协议森林14 逆袭 (CIDR与NAT) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! IPv4由于最初的设计原因,长度只有32 ...

  9. dnSpy C#逆向工具

    dnSpy下载地址:https://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasemblers/dnSpy.shtml ...

  10. Java ServerSocket详解

    ServerSocket 构造方法 ServerSocket serverSocket = new ServerSocket(); ServerSocket(); //无参数 ServerSocket ...