余祥宣, 崔国华, 邹海明. 计算机算法基础.3版[M]. 华中科技大学出版社, 2006.
P117 算法5.9
程序的输入是一个名字为input.txt的文件,保存时注意编码格式再VS上运行的话要保存为ANSI编码,如果需要的话我可以上传一份
6 10
1 2 10
1 4 30
1 5 45
2 3 50
2 5 40
2 6 25
3 5 35
3 6 15
4 6 20
5 6 55
顶点数6 边数10
顶点1 顶点2 权值
6 10
1 2 6
1 3 1
1 4 5
2 3 5
2 5 3
3 4 5
3 5 6
3 6 4
4 6 2
5 6 6
#include<iostream>
#include<fstream>
using namespace std;
#define MAX 8//
#define MAXCOST 0x7fffffff
int COST[MAX][MAX];
int PARENT[MAX];
void Union(int i, int j)
{
int x = PARENT[i] + PARENT[j];
if (PARENT[i] < PARENT[j])
{
PARENT[i] = x;
PARENT[j] = i;
}
else
{
PARENT[j] = x;
PARENT[i] = j;
}
}
int Find(int i)
{
int j = i;
while (PARENT[j] > 0)
{
j = PARENT[j];
}
return j;
}
void FindMinCost(int COST[][MAX], int n, int &k, int &l)
{
int min = COST[1][1];
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
if (min > COST[i][j])
{
min = COST[i][j];
k = i;
l = j;
}
}
}
}
void Kruskal(int COST[][MAX], int n, int T[][2], int &mincost)
{
for (int i = 1; i <= n; i++)
PARENT[i] = -1;
int i = 0;
mincost = 0;
int u, v,j,k;
while (i < n - 1)
{
FindMinCost(COST, n, u, v);
j = Find(u);
k = Find(v);
if (j != k)
{
i++;
T[i][1] = u;
T[i][2] = v;
mincost = mincost + COST[u][v];
cout << "V" << T[i][1] << "->V" << T[i][2] << " COST=" << COST[u][v] << " Total=" << mincost << endl;
Union(j, k);
}
COST[u][v] = MAXCOST;
}
if (i != n-1)
cout << "NO SPANNING TREE\n";
}
int main()
{
int i, j, k, m, n, cost;
ifstream in("input.txt");
in >> m >> n;
for (i = 0; i <= m; i++)
{
for (j = 0; j <= m; j++)
{
COST[i][j] = MAXCOST;
}
}
for (k = 1; k <= n; k++)
{
in >> i >> j >> cost;
COST[i][j] = cost;
COST[j][i] = cost;
}
int t[MAX][2], mincost = MAXCOST;
Kruskal(COST, m, t, mincost);
cout << "最小权值和=" << mincost << endl;
system("pause");
return 0;
}
运行结果