puk1251 最小生成树
Description

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 / ...
随机推荐
- burp suite 之 intruder(入侵者)
intruder:包括自动提交请求的功能 登录密码 撞库 注入 脱裤 Fuzz Burp intruder包含四个模块: Target:攻击的网站目标的详情信息 Positions :用来设置攻击类型 ...
- Chrome使用video无法正常播放MP4视频的解决方案
H5的video标签让前端开发者用一行代码就可以实现视频和音频的播放,然而,有时候我们会突然发现,某些Mp4格式的视频在Chrome下居然无法正常播放?这究竟是什么原因呢?这篇文章主要分析了部分Mp4 ...
- get请求传递json格式数据的两种方法
get请求参数为json格式数据,使用pyhton+request的两种实现方式如下: 方法一:使用requests.request() 示例代码如下: 1.导入requests和json impor ...
- mybatis动态条件组合分页查询
一.动态条件处理 需要使用mybatis的动态sql 1 <select id="selectItemByCondition" parameterType="com ...
- Centos-服务管理-systemctl
systemctl命令属于systemd软件包,这个软件包不仅可以完成系统的初始化工作,还能对系统和服务进行管理 在centos7中,服务单元取代启动脚本,服务单元以.service为文件扩展名,配置 ...
- Python练习题 048:Project Euler 021:10000以内所有亲和数之和
本题来自 Project Euler 第21题:https://projecteuler.net/problem=21 ''' Project Euler: Problem 21: Amicable ...
- 【数量技术宅 | Python爬虫系列分享】实时监控股市重大公告的Python爬虫
实时监控股市重大公告的Python爬虫小技巧 精力有限的我们,如何更加有效率地监控信息? 很多时候特别是交易时,我们需要想办法监控一些信息,比如股市的公告.如果现有的软件没有办法实现我们的需求,那么就 ...
- JS-YAML -YAML 1.2 JavaScript解析器/编写器
下载 JS-YAML -YAML 1.2 JavaScript解析器/编写器JS-YAML -YAML 1.2 JavaScript解析器/编写器 在线演示 这是YAML的实现,YAML是一种对人友好 ...
- 二进制K8S集群使用Bootstrap Token 方式增加Node
TLS Bootstraping:在kubernetes集群中,Node上组件kebelet和kube-proxy都需要与kube-apiserver进行通信,为了增加传输安全性,采用https方式, ...
- NOIP提高组2016 D1T2 【天天爱跑步】
码了一个下午加一个晚上吧...... 题目描述: 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成 ...