标签:
注意:
注意数组越界问题(提交出现runtimeError代表数组越界)
刚开始提交的时候,边集中边的数目和点集中点的数目用的同一个宏定义,但是宏定义是按照点的最大数定义的,所以提交的时候出现了数组越界问题,以后需要注意啦。
Description
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=30; /*边结构*/ typedef struct{ int start;//道路起点 int end;//道路终点 double value;//道路权值 }Edge; Edge road[80]; /*节点集合*/ int node[MAXN]; /*寻根函数*/ int Find_set(int n){ if(node[n]==-1) 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=0; int cost=0; sort(road,road+M,cmp); for(int i=0;i<M;i++){ if(Merge(road[i].start,road[i].end)){ num++; cost+=road[i].value; } if(num==N-1) break; } if(num!=N-1) return -1; //不能产生最小生成树 else return cost; } int main() { int n; //freopen("input.txt", "r", stdin); while(scanf("%d", &n) != EOF) { if(n == 0) break; for(int i = 0; i < n; i++) node[i] = i; char s, e; int num, cost, k = 0; for(int i = 0; i < n-1; i++) { cin >> s >> num; for(int j = 0; 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 0; }
kruskal算法求最小生成树(jungle roads的kruskal解法)
标签:
原文地址:http://www.cnblogs.com/rain-1/p/5676976.html