puk1251 最小生成树
Description
![](http://poj.org/images/1251_1.jpg)
The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago. But the jungle overtakes roads relentlessly, so the large road network is too expensive to maintain. The Council of Elders must choose to stop maintaining some roads. The map above on the left shows all the roads in use now and the cost in aacms per month to maintain them. Of course there needs to be some way to get between all the villages on maintained roads, even if the route is not as short as before. The Chief Elder would like to tell the Council of Elders what would be the smallest amount they could spend in aacms per month to maintain roads that would connect all the villages. The villages are labeled A through I in the maps above. The map on the right shows the roads that could be maintained most cheaply, for 216 aacms per month. Your task is to write a program that will solve such problems.
Input
Output
Sample Input
9
A 2 B 12 I 25
B 3 C 10 H 40 I 8
C 2 D 18 G 55
D 1 E 44
E 2 F 60 G 38
F 0
G 1 H 35
H 1 I 35
3
A 2 B 10 C 40
B 1 C 20
0
Sample Output
216
30
#include<stdio.h>
#define A 30
int a[A][A]; //邻接矩阵
int lowcost[A]; //保存已在生成树中的顶点到未在生成树中顶点的最短长度
// 找出权值最小的两个顶点的位置 ,并返回其中一个顶点的位置
int First(int n){
int i,j,min,flag;
min=100;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(min>a[i][j]&&a[i][j]!=0){
min=a[i][j];
flag=i;
}
}
}
return flag;
}
//找出lowcost[]中最短的长度
int minimum(int n){
int i,min,flag=1;
min=100;
for(i=1;i<=n;i++){
if(min>lowcost[i]&&lowcost[i]!=0){
flag=i;
min=lowcost[i];
}
}
return flag;
}
void Tree(int n){
int i,j,k,sum=0;
k = First(n); //得到位置
for(i=1;i<=n;i++){
if(i!=k){
lowcost[i]=a[k][i]; //初始化lowcost[]
}
}
lowcost[k]=0; //每次加入生成树中的顶点对应的位置的权值更新为0
for(i=1;i<n;i++){
k=minimum(n); //获取locost[]中最小的位置
sum=sum+lowcost[k]; //求路径长度值和
lowcost[k]=0; //每次加入生成树中的顶点对应的位置的权值更新为0
//更新lowcost[],如果找到的最小位置到其他顶点的权值小于在lowcost[]中的,就更新为较小的
for(j=1;j<=n;j++){
if(a[k][j]<lowcost[j]&&j!=k){
lowcost[j]=a[k][j];
}
}
}
printf("%d\n",sum);
}
int main()
{
int N,i,j,k,x,y,z;
char ch1[2],ch2[2];
for(i=1;i<=A;i++)
for(j=1;j<=A;j++)
a[i][j]= 100;
scanf("%d",&N);
while(N!=0){
for(i=1;i<N;i++){
scanf("%s %d",ch1,&j);
y=ch1[0]-'A'+1;
for(k=1;k<=j;k++){
scanf("%s %d",ch2,&x); //接收字符
z=ch2[0]-'A'+1; //保存两点间的权值
a[y][z]=x;
a[z][y]=x;
}
}
for(i=1;i<=N;i++){
for(j=1;j<=N;j++) printf(" %d ",a[i][j]);
printf("\n");
} Tree(N);
//执行一次后初始化邻接矩阵
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
a[i][j]= 100;
scanf("%d",&N);
}
return 0;
}
puk1251 最小生成树的更多相关文章
- 最小生成树(Kruskal算法-边集数组)
以此图为例: package com.datastruct; import java.util.Scanner; public class TestKruskal { private static c ...
- 最小生成树计数 bzoj 1016
最小生成树计数 (1s 128M) award [问题描述] 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一 ...
- poj 1251 Jungle Roads (最小生成树)
poj 1251 Jungle Roads (最小生成树) Link: http://poj.org/problem?id=1251 Jungle Roads Time Limit: 1000 ...
- 【BZOJ 1016】【JSOI 2008】最小生成树计数
http://www.lydsy.com/JudgeOnline/problem.php?id=1016 统计每一个边权在最小生成树中使用的次数,这个次数在任何一个最小生成树中都是固定的(归纳证明). ...
- 最小生成树---Prim算法和Kruskal算法
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...
- Delaunay剖分与平面欧几里得距离最小生成树
这个东西代码我是对着Trinkle的写的,所以就不放代码了.. Delaunay剖分的定义: 一个三角剖分是Delaunay的当且仅当其中的每个三角形的外接圆内部(不包括边界)都没有点. 它的存在性是 ...
- 最小生成树(prim&kruskal)
最近都是图,为了防止几次记不住,先把自己理解的写下来,有问题继续改.先把算法过程记下来: prime算法: 原始的加权连通图——————D被选作起点,选与之相连的权值 ...
- 最小生成树 prime poj1258
题意:给你一个矩阵M[i][j]表示i到j的距离 求最小生成树 思路:裸最小生成树 prime就可以了 最小生成树专题 AC代码: #include "iostream" #inc ...
- 最小生成树 prime + 队列优化
存图方式 最小生成树prime+队列优化 优化后时间复杂度是O(m*lgm) m为边数 优化后简直神速,应该说对于绝大多数的题目来说都够用了 具体有多快呢 请参照这篇博客:堆排序 Heapsort / ...
随机推荐
- python协程(yield、asyncio标准库、gevent第三方)、异步的实现
引言 同步:不同程序单元为了完成某个任务,在执行过程中需靠某种通信方式以协调一致,称这些程序单元是同步执行的. 例如购物系统中更新商品库存,需要用"行锁"作为通信信号,让不同的更新 ...
- zabbix_server.conf配置文件参数
NodeID: 在amster-child 的分布式架构中,这个ID是唯一标识zabbix node的号码 ListenPort:Trapper 类型Item监听的端口, SourceIP: 在连接其 ...
- 数据结构 - 堆(Heap)
数据结构 - 堆(Heap) 1.堆的定义 堆的形式满足完全二叉树的定义: 若 i < ceil(n/2) ,则节点i为分支节点,否则为叶子节点 叶子节点只可能在最大的两层出现,而最大层次上的叶 ...
- mysql 空值(null)和空字符('')的区别
日常开发中,一般都会涉及到数据库增删改查,那么不可避免会遇到Mysql中的NULL和空字符. 空字符(")和空值(null)表面上看都是空,其实存在一些差异: 定义: 空值(NULL)的长度 ...
- Django-Scrapy生成后端json接口
Django-Scrapy生成后端json接口: 网上的关于django-scrapy的介绍比较少,该博客只在本人查资料的过程中学习的,如果不对之处,希望指出改正: 以后的博客可能不会再出关于djan ...
- 在KEIL下查看单片机编程内存使用情况
原文链接:https://blog.csdn.net/D_azzle/article/details/83410141 截至到目前为止,本人接触单片机也有将近一年的时间.这一年以来也接触过了很具代表性 ...
- Layman 使用ffmpeg-php扩展库实现视频截图(默认图)
这几天做项目,其中一个需求是用户上传视频文件到服务器,然后服务器自动截取该视频的一帧作为该视频对应的缩略图,服务器端语言采用php编写,找了半天资料,发现ffmpeg-php可以满足该需求,所以下面简 ...
- C++中头文件简介(stdio.h & chrono)
参考: 1. https://baike.baidu.com/item/stdio.h 2. https://www.cnblogs.com/jwk000/p/3560086.html 1. stdi ...
- idea 2020.1 Mybatis log plugin破解插件
下载 链接: https://pan.baidu.com/s/1FTgtJiyzxxaNxWLyX4OgZw 密码: w7w8 idea安装本地插件
- 笔记本电脑为什么有时候不用按FN+F1~12也可以控制音量、亮度全部等等
对于经常要使用F1~F12的用户就很烦,比如编写前端代码的时候想直接按F12检查代码就是不行. 如何取消快捷键? 问题原因: 1.电脑默认使用了快捷键. 2.电脑按了FN+ESC锁定,只限于戴尔的电脑 ...