算法6.9-克鲁斯卡尔算法
![在这里插入图片描述](https://img-blog.csdnimg.cn/f784da2995f14c2bb2d824dd386b1b44.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd2h1dF81Mnhq,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
代码实现
#pragma once
#include <iostream>
#include <algorithm>
using namespace std;
#define MaxInt 32767
#define MVNum 100
typedef char VerTexType;
typedef int ArcType;
typedef struct
{
VerTexType vexs[MVNum];
ArcType arcs[MVNum][MVNum];
int vexnum, arcnum;
}AMGraph;
struct Edges{
VerTexType Head;
VerTexType Tail;
ArcType lowcost;
}Edge[(MVNum * (MVNum - 1)) / 2];
int Vexset[MVNum];
int cmp(Edges &s1, Edges& s2)
{
return s1.lowcost < s2.lowcost;
}
int LocateVex(AMGraph G, VerTexType v)
{
int i;
for (i = 0; i < G.vexnum; i++)
{
if (v == G.vexs[i])
{
return i;
}
}
}
void CreateUDN(AMGraph& G)
{
VerTexType v1, v2;
ArcType w;
int row;
int col;
cout << "请输总顶点数:";
cin >> G.vexnum;
cout << "请输总边数:";
cin >> G.arcnum;
for (int i = 0; i < G.vexnum; i++)
{
cout << "输入顶点:";
cin >> G.vexs[i];
}
for (int m = 0; m < G.vexnum; m++)
{
for (int n = 0; n < G.vexnum; n++)
{
G.arcs[m][n] = MaxInt;
}
}
for (int k = 0; k < G.arcnum; k++)
{
cout << "输入边依附的顶点以及权值:";
cin >> v1 >> v2 >> w;
row = LocateVex(G, v1);
col = LocateVex(G, v2);
G.arcs[row][col] = w;
G.arcs[col][row] = G.arcs[row][col];
Edge[k].lowcost = w;
Edge[k].Head = v1;
Edge[k].Tail = v2;
}
}
void ShowGraph(AMGraph G)
{
cout << "无向网的邻接矩阵为:" << endl;
for (int i = 0; i < G.vexnum; i++)
{
for (int j = 0; j < G.vexnum; j++)
{
if (G.arcs[i][j] == MaxInt)
{
cout << "∞" << " ";
}
else
{
cout << G.arcs[i][j] << " ";
}
}
cout << endl;
}
}
void MiniSpanTree_Kruskal(AMGraph G)
{
sort(Edge, Edge + G.arcnum, cmp);
for (int i = 0; i < G.vexnum; i++)
{
Vexset[i] = i;
}
for (int j = 0; j < G.arcnum; j++)
{
int v1 = LocateVex(G, Edge[j].Head);
int v2 = LocateVex(G, Edge[j].Tail);
int vs1 = Vexset[v1];
int vs2 = Vexset[v2];
if (vs1 != vs2)
{
cout << Edge[j].Head << "--->" << Edge[j].Tail << endl;
for (int k = 0; k < G.vexnum; k++)
{
if (Vexset[k] == vs2)
{
Vexset[k] = vs1;
}
}
}
}
}
int main() {
AMGraph G;
CreateUDN(G);
ShowGraph(G);
cout << "************算法6.9 克鲁斯卡尔算法**************" << endl;
MiniSpanTree_Kruskal(G);
system("pause");
return 0;
}
运行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/0c7459104f274f66a70e8cbfaf6b4868.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd2h1dF81Mnhq,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)