/*
* File name : cmst01.cpp
* Function : 图的最小生成树 Kruskal算法 C++实现
* Created on : 2016年6月8日
* Author : beijiwei@qq.com
* Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性。
任何单位和个人不经本人允许不得用于商业用途
input:
6 9
2 4 11
3 5 13
4 6 3
5 6 4
2 3 6
4 5 7
1 2 1
3 4 9
1 3 2
*/
#include <cstdio>
#include <iostream>
#pragma warning(disable:4996)
using namespace std;
typedef struct edge{
int start;
int end;
int weight;
}Edge;
#define M 20
Edge edge_map[M];
int path[M];
int boss[M];
int get_boss(int x);
int join(int x, int y);
int main(int argc, char** argv)
{
freopen("input.txt", "r", stdin);
int vertex_num, edge_num;
cin >> vertex_num>>edge_num;
for (int i = 1; i <= edge_num; i++)//读入边的信息
{
cin >> edge_map[i].start >> edge_map[i].end >> edge_map[i].weight;
}
for (int i = 1; i <= edge_num; i++)// 对边进行 按权值 作升序排序, 选择排序
{
int k = 1;
Edge tmp;
for (int j = i+1; j <= edge_num; j++)
{
if (edge_map[k].weight > edge_map[j].weight)
{
k = j;
}
}
tmp = edge_map[i];
edge_map[i] = edge_map[k];
edge_map[k] = tmp;
}
//初始化并查集
for (int i = 1; i <= vertex_num; i++)
{
boss[i] = i;
}
int edge_count = 0, weight_sum=0;
for (int i = 1; i <= edge_num; i++)
{
if (join(edge_map[i].start, edge_map[i].end) == 1)// 如果 这条边的两个顶点 尚未联通,则选用这条边
{
path[edge_count] = i;
edge_count++;
weight_sum += edge_map[i].weight;
}
if (edge_count == vertex_num - 1)
{
break;
}
}
cout << "最短路径是: " << weight_sum << endl;
for (int i = 0; i < edge_count; i++)
{
cout << "边的起点,终点,权值分别是: " << edge_map[path[i]].start << " , " << edge_map[path[i]].end << " , " << edge_map[path[i]].weight << endl;
}
return 0;
}
int get_boss(int x)
{
int tmp;
if (boss[x] == x)
{
tmp= x;
}
else{
tmp = get_boss(boss[x]);
boss[x] = tmp;
}
return tmp;
}
int join(int x, int y)
{
int bossx, bossy;
bossx = get_boss(x);
bossy = get_boss(y);
if (bossx != bossy)
{
boss[bossy] = bossx;
get_boss(y);
return 1;// 不在同一个集合中
}
return 0;// 在同一个集合中
}
图的最小生成树 Kruskal算法 C++实现
最新推荐文章于 2024-06-27 09:22:55 发布