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 ...
随机推荐
- Highways(求最小生成树的最大边)
Highways Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total Sub ...
- Intellij Idea的一些配置
1.字体 修改IDEA面板字体:Settings->Appearance-> Override default fonts by(not recommended)选中,选择自己喜欢的字体 ...
- Oracle错误ORA-03113: end-of-file on communication channel处理办法
oracle不能启动了,报错ORA-03113: end-of-file on communication channel (通信通道的文件结尾) 解决办法: SQL> startup ORAC ...
- TCP/IP详解之:ICMP协议
ICMP协议: ICMP是IP层的一个组成部分,ICMP报文是在IP数据报内部被传输的,用于在IP主机.路由器之间传递控制消息.控制消息是指网络不通.主机是否可达.路由是否可用等网络本身的消息.这些控 ...
- leetcode Search in Rotated Sorted Array python
#Suppose a sorted array is rotated at some pivot unknown to you beforehand. #(i.e., 0 1 2 4 5 6 7 ...
- css3实现三角形,聊天背景气泡,心形等形状
1.聊天背景气泡: css代码如下: #talkbubble {width: 120px;margin:auto; background: red; position: relative; -moz- ...
- 对config配置文件的读取和修改
在c#中想要使用对congfig文件的操作必要引用一个dll“system.configuration.dll” 读取 : string str= System.Configuration.Conf ...
- Windows的历史zt
原文地址:http://windows.microsoft.com/zh-CN/windows/history#T1=era0 1975–1981:Microsoft 起步 Microsoft 联合创 ...
- MySQLdb的安装
第一步:下载安装介质 https://pypi.python.org/pypi/MySQL-python 注意虽然模块名叫MySQLdb但是MySQL-python指的就是MySQLdb 第二步:安装 ...
- SQL Server 行的删除与修改-------------(未完待续P222 deep SQL Server 222 )
删除: 1.堆表:当行被删除时,不会自动重新组织页面上的空间.删除行时不会从物理页面上删除, 而只是把行偏移设置为 0 .表示空间没有使用.除了页面上没有被回收空间之外,堆中的 空白页也常常不会被回收 ...