#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define N 100
#define M 10010
int l;
int fa[N];
int n,m;
bool ma[N][N];//原图的邻接矩阵
struct node1//存储最小生成树中边
{
int from,to,weight;
}e[M];
struct node//存储原图中的所有边
{
int u,v,w;
}edge[M];
int find(int x)//并查集中找树根
{
if (x == fa[x]) return x;
else return fa[x] = find(fa[x]);
}
void add(int x, int y, int z)//添加边
{
l++;
e[l].from = x;e[l].to = y;
e[l].weight = z;
}
void print()//打印最小生成树中的边
{
for (int i=1;i<=l;i++)
printf("%d->%d, %d\n", e[i].from, e[i].to, e[i].weight);
}
int partition(int low, int high)
{
struct node pivot = edge[low];
while (low < high)
{
while (low < high && edge[high].w > pivot.w) high--;
edge[low] = edge[high];
while (low < high && edge[low].w <= pivot.w) low++;
edge[high] = edge[low];
}
edge[low] = pivot;
return low;
}
void qsort(int l, int r)//快速排序
{
if (l<r)
{
int pivotpos = partition(l,r);
qsort(l,pivotpos-1);
qsort(pivotpos+1,r);
}
}
void Kruskal()
{
qsort(1,m);//qsort函数对原图中的所有边的按照权值进行排序
int s = 0;
int ans = 0;
int u,v;
for (int i=1;i<=m;i++)
{
u = find(edge[i].u);//并查集
v = find(edge[i].v);
if (u != v)
{
s++;//统计边数
ans += edge[i].w;//累加权值
fa[u] = v;
add(edge[i].u, edge[i].v, edge[i].w);//添加最小生成树中的边
}
if (s == n-1) break;
}
if (s < n-1)
printf("There is no solution of MST!");//判断最小生成树无解
else
{
printf("The total weight of MST is %d\n", ans);//输出最小生成树的边总权值
print();//输出最小生成树中的左右边
}
}
int main()
{
printf("Please input the number of Vertexs n and the number of Edges of the Graph\n");
printf("N = ");
scanf("%d", &n);
printf("M = ");
scanf("%d", &m);
for (int i=1;i<=n;i++) fa[i] = i;
memset(ma,0,sizeof(ma));//存储原图 ,用邻接矩阵存储
for (int i=1;i<=m;i++)
{
scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].w);
ma[edge[i].u][edge[i].v] = 1;
}
Kruskal();
}
数据结构实验kruscal
最新推荐文章于 2024-03-10 20:31:51 发布