Kruskal最小生成树算法

来源:互联网 发布:淘宝店怎么提升信誉 编辑:程序博客网 时间:2024/06/06 06:50

#include<iostream>using namespace std;int arcNum = 9;// 边数为9int ptNum = 6;struct edge{int start;int end;int weight;}a[9] = { {1,2,34},{1,3,46},{1,6,19}, {2,5,12},{4,5,38},{4,6,25},{3,4,17},{3,6,25},{5,6,26} };//该图引用的dijkstra里的图char ch[7] = { ' ','A','B','C','D','E','F' };//如a[9]为{1,2,34},根据字符数组可得a[1],a[2]之间的权值为34 即AB之间的权值为34void sort();int Find(int *parent, int f){while (parent[f] > 0)f = parent[f];return f;}void Kruskal(){int i, m, n;int minWeight = 0;int parent[10]; //用来判断边是否形成环路,如parent[2]=5意思是指: 2,5在同一棵生成树上memset(parent, 0, sizeof(int) * 10);  for (i = 0; i < arcNum; i++){m = Find(parent, a[i].start);//下一个可存放的位置n = Find(parent, a[i].end);//下下一个if (m != n) //如果相等的话,则说明形成环路{parent[m] = n; cout << ch[a[i].start] << "和" << ch[a[i].end ]<< "加入, 权值:" << a[i].weight<<endl;minWeight += a[i].weight;}}//parent最终的值为{0, 6, 5, 4, 6, 6, 0, 0, 0, 0}//m,n值的变化:(2,5)(3,4)(1,6) (3,6)->(4,6)  (5,6)cout << "最小权值为: " << minWeight << endl;}int main(void){sort();//对权值先进行排序Kruskal();system("pause");return 0;}void sort(){for (int i = 0; i < arcNum-1; i++){int min = i;for (int j = i; j < arcNum; j++)if (a[min].weight > a[j].weight)min=j;if (min != i){int t;t = a[min].start;a[min].start = a[i].start;a[i].start = t;t = a[min].end;a[min].end = a[i].end;a[i].end = t;t = a[min].weight;a[min].weight = a[i].weight;a[i].weight = t;}}}


0 0
原创粉丝点击