余祥宣, 崔国华, 邹海明. 计算机算法基础.3版[M]. 华中科技大学出版社, 2006.
P114 算法5.7
程序的输入是一个名字为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 NEAR[MAX];
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 Prim(int COST[][MAX],int n,int T[][2], int &mincost)
{
int k, l,i,j;
//寻找最小成本的边
FindMinCost(COST,n,k,l);
mincost = COST[k][l];
T[1][1] = k, T[1][2] = l;
cout << "V" << T[1][1] << "->V" << T[1][2] << " COST=" << COST[k][l] << " Total=" << mincost << endl;
for (i = 1; i <= n; i++)
{
if (COST[i][l] < COST[i][k])
NEAR[i] = l;
else
NEAR[i] = k;
}
NEAR[k] = NEAR[l] =0;
NEAR[0] = 0;
for (i = 2; i <= n - 1; i++)
{
//寻找满足条件的j
j = 0;
for (int index = 1; index <= n; index++)
{
if (NEAR[index] != 0&&COST[index][NEAR[index]]<COST[j][NEAR[j]])
{
j = index;
}
}
T[i][1] = j;
T[i][2] = NEAR[j];
mincost = mincost + COST[j][NEAR[j]];
cout << "V" << T[i][1] << "->V" << T[i][2] <<" COST="<< COST[j][NEAR[j]]<<" Total="<<mincost<< endl;
NEAR[j] = 0;
for (k = 1; k <= n; k++)
{
if (NEAR[k] != 0 && COST[k][NEAR[k]] > COST[k][j])
NEAR[k] = j;
}
}
if (mincost >= MAXCOST)
cout << "NO SPANNING TREE\n";
}
int main()
{
int i, j, k, m, n,cost;
ifstream in("input.txt");
in >> m >> n;//m=顶点的个数,n=边的个数
//初始化图G
for (i = 0; i <= m; i++)
{
for (j = 0; j <= m; j++)
{
COST[i][j] = MAXCOST;
}
}
//构建图G
for (k = 1; k <= n; k++)
{
in >> i >> j >> cost;
COST[i][j] = cost;
COST[j][i] = cost;
}
//求解最小生成树
int t[MAX][2], mincost=MAXCOST;
Prim(COST, m,t,mincost);
//输出最小权值和
cout << "最小权值和=" << mincost << endl;
system("pause");
return 0;
}
运行结果
1037

被折叠的 条评论
为什么被折叠?



