kruskal算法
C++代码实现
- 输入边信息:两顶点及权重
- 按权重从小到大排序
- 找n-1条不构成回路的最小边(难点:判断是否构成回路)
#include<iostream>
using namespace std;
//边结构体
typedef struct edge {
int vex1;
int vex2;
int weight;
}edge;
int main()
{
edge ed[10];
int i = 0;
cout << "请输入两点及权重:" << endl;
for (i = 0; i < 10; i++)
{
cin >> ed[i].vex1 >> ed[i].vex2 >> ed[i].weight;
}
//按照权重从小到大排序
for (i = 0; i < 10; i++)
{
int t = 0;
int min = 0x7fffffff;
for (int j = i; j < 10; j++)
{
if (ed[j].weight < min)
{
min = ed[j].weight;
t = j;
}
}
edge m;
m = ed[i];
ed[i] = ed[t];
ed[t] = m;
}
//储存顶点之间是否可达标志
bool visited[10][10] = { false };
for (i = 0; i < 10; i++)
visited[i][i] = true;
//找不构成回路的最小边
for (i = 0; i < 10; i++)
{
if (visited[ed[i].vex1][ed[i].vex2] == false)
{
visited[ed[i].vex1][ed[i].vex2] = true;
visited[ed[i].vex2][ed[i].vex1] = true;
cout << ed[i].vex1 << "-" << ed[i].vex2 << ":" << ed[i].weight << endl;
//更新可达状态
for (int j = 0; j < 10; j++)
{
if (visited[ed[i].vex1][j])
visited[ed[i].vex2][j] = visited[ed[i].vex1][j];
if(visited[ed[i].vex2][j])
visited[ed[i].vex1][j] = visited[ed[i].vex2][j];
}
for (int j = 0; j < 10; j++)
{
if (visited[ed[i].vex1][j])
{
for (int k = 0; k < 10; k++)
{
if (visited[ed[i].vex1][k])
visited[j][k] = visited[ed[i].vex1][k];
}
}
if (visited[ed[i].vex2][j])
{
for (int k = 0; k < 10; k++)
{
if (visited[ed[i].vex2][k])
visited[j][k] = visited[ed[i].vex2][k];
}
}
}
}
}
}