kruskal算法求最小生成树(jungle roads的kruskal解法)
注意:
注意数组越界问题(提交出现runtimeError代表数组越界)
刚开始提交的时候,边集中边的数目和点集中点的数目用的同一个宏定义,但是宏定义是按照点的最大数定义的,所以提交的时候出现了数组越界问题,以后需要注意啦。
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
//数组越界会出现runtimeerror的错误,注意边的数目和点的数目不一样,用一个宏定义的时候注意是否会出现数组越界问题 /*
题意:
多组案例
每组案例第一行输入一个数字n
下面n-1行
每行的第一个数据都是一个字符start,字符从A往后依次排列
每行的第二个数据是一个数字num,表示有num个节点与该行第一个字符表示的节点相连
每行接下来的数据是num组end,cost,表示start到end的花费为cost
具体输入输出看案例就会懂
解法:Kruskal算法
*/
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <iostream>
using namespace std;
const int MAXN=;
/*边结构*/
typedef struct{
int start;//道路起点
int end;//道路终点
double value;//道路权值
}Edge;
Edge road[]; /*节点集合*/
int node[MAXN];
/*寻根函数*/
int Find_set(int n){
if(node[n]==-) return n;
return node[n] == n ? node[n] : Find_set(node[n]);
//return node[n]=Find_set(node[n]);
}
/*排序中的比较函数*/
bool cmp(Edge a,Edge b){
if(a.value<b.value) return true;
return false;
}
/*合并:将棵树合并成一棵树*/
bool Merge(int a,int b){
int r1=Find_set(a);
int r2=Find_set(b);
if(r1==r2) return false;
if(r1<r2) node[r2]=r1;
if(r2<r1) node[r1]=r2;
return true;
}
/*克鲁斯卡尔算法*/
int Kruskal(int N,int M){ //N 顶点数 M 边数
int num=;
int cost=;
sort(road,road+M,cmp);
for(int i=;i<M;i++){
if(Merge(road[i].start,road[i].end)){
num++;
cost+=road[i].value;
}
if(num==N-) break;
}
if(num!=N-) return -; //不能产生最小生成树
else return cost;
}
int main()
{
int n;
//freopen("input.txt", "r", stdin);
while(scanf("%d", &n) != EOF)
{
if(n == )
break;
for(int i = ; i < n; i++)
node[i] = i;
char s, e;
int num, cost, k = ;
for(int i = ; i < n-; i++)
{
cin >> s >> num;
for(int j = ; j < num; j++, k++)
{
cin >> e >> cost;
road[k].start = s - 'A';
road[k].end = e - 'A';
road[k].value = cost;
}
}
sort(road, road+k, cmp);
int ret = Kruskal(n, k);
printf("%d\n", ret);
}
return ;
}
kruskal算法求最小生成树(jungle roads的kruskal解法)的更多相关文章
- 利用Kruskal算法求最小生成树解决聪明的猴子问题 -- 数据结构
题目:聪明的猴子 链接:https://ac.nowcoder.com/acm/problem/19964 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个 ...
- 克鲁斯卡尔(Kruskal)算法求最小生成树
/* *Kruskal算法求MST */ #include <iostream> #include <cstdio> #include <cstring> #inc ...
- Prim算法和Kruskal算法求最小生成树
Prim算法 连通分量是指图的一个子图,子图中任意两个顶点之间都是可达的.最小生成树是连通图的一个连通分量,且所有边的权值和最小. 最小生成树中,一个顶点最多与两个顶点邻接:若连通图有n个顶点,则最小 ...
- Prime算法 与 Kruskal算法求最小生成树模板
算法原理参考链接 ==> UESTC算法讲堂——最小生成树 关于两种算法的复杂度分析 ==> http://blog.csdn.net/haskei/article/details/531 ...
- Kruskal算法求最小生成树
Kruskal算法是根据权来筛选节点,也是采用贪心算法. /// Kruskal ///初始化每个节点为独立的点,他的祖先为自己本身 void made(int n) { ; i<=n; i++ ...
- 859. Kruskal算法求最小生成树(模板)
给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数. 求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible. 给定一张边带权的无向图G=(V, E),其中V表示 ...
- Kruskal算法求最小生成树 笔记与思路整理
整理一下前一段时间的最小生成树的算法.(其实是刚弄明白 Kruskal其实算是一种贪心算法.先将边按权值排序,每次选一条没选过的权值最小边加入树,若加入后成环就跳过. 先贴张图做个示例. (可视化均来 ...
- Kruskal算法求最小生成树(POJ2485)
题目链接:http://poj.org/problem?id=2485 #include <iostream> #include <stdio.h> #include < ...
- AcWing 859. Kruskal算法求最小生成树 稠密图
//稠密图 #include <cstring> #include <iostream> #include <algorithm> using namespace ...
随机推荐
- PHPExcel Fatal error: ZipArchive library is not enabled
导致上述问题的可能性有两种: 1.没开启php_zip.dll扩展 a.在Windows下的解决办法是: (a1) 在php.ini文件中,将extension=php_zip.dll前面的分号“; ...
- find the safest road
find the safest road Time Limit : 10000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Othe ...
- 分布式拒绝服务攻击(DDoS)原理及防范【转】
DDoS攻击概念 DoS的攻击方式有很多种,最基本的DoS攻击就是利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应. DDoS攻击手段是在传统的DoS攻击基础之上产生的一类攻击 ...
- hdu4740【杭州网赛、模拟、有点搜索?】
当时看了这题就感觉so easy... 本来不想写的,后来感觉是不是可以练一下搜索水平.. 比赛时有人过了就没写. 比赛完了写一下. 实现还不是那么顺利, 囧 本来自己以为这题能练下搜 ...
- 使用instantclient_11_2 和PL/SQL Developer工具包连接oracle 11g远程数据库
本文转自CSDN博客,http://blog.csdn.net/helifengwell/archive/2010/08/18/5820434.aspx 1,先到Oracle站点下载Instant C ...
- 两种Makefile
.PHONY:clean CC=g++ CFLAGS=-Wall -g BIN=test_queue OBJS=Queue.o test_main.o $(BIN):$(OBJS) $(CC) $(C ...
- IsNullOrEmpty和s == null || s.Length == 0哪个快
在写扩展方法时,看到有人用==null这个方法,说快,上网找了些资料,最后在csdn的博客上看到了一篇文章,说实测是后两者快,于是我也试着做了一个程序运行了一下,却发现这样的结果: 我测试了一个,发现 ...
- 让Linux修改IP、DNS等可以更简单
修改IP: 可以用 netconfig,可惜每次都得输入完整的IP.掩码.网关和DNS. 不如直接 vi /etc/sysconfig/network-scripts/ifcfg-eth0 再 /et ...
- NavigationBar--修改返回按钮的标题
UIBarButtonItem *backItem = [[[UIBarButtonItem alloc] init] autorelease]; backItem.title = @"返回 ...
- 简单的BFS学习笔记
什么是BFS传送门. 今天学习BFS,加油! 先定义个数组: struct Node{ int a=0; int b=0; int step=0; }; int map[5][4]={//地图 0,0 ...