#include<iostream>
using namespace std;
#define MAX 100
#define INF 0x7fffffff
int graph[MAX][MAX];
int prim(int graph[][MAX], int n)
{
int distance[MAX];//用来存数组下标为终点的,以选中(加入MST最小生成树的)为起点的距离
int nearest[MAX];//存以数组下标为终点的对应的起点
int i, j, sum = 0, min, vnear;
for (i = 2; i <= n; i++)
{
distance[i] = graph[1][i];//V_1到其他点的距离
nearest[i] = 1;//因为在一开始的时候,默认起点全部为V_1
}
nearest[1] = 0;
for (i = 2; i <= n; i++)//循环n-1次,让所有的点都加入到nearest中
{
min = INF;
for (j = 2; j <= n; j++)//检查每个顶点是否与Y最近
{
if (distance[j] < min&&distance[j] != 0)
{
min = distance[j];
vnear = j;
}
}
cout << 'V' << vnear << "->";//输出最短路径上的所经过的点
sum += min;
distance[vnear] = 0;//表面新的点已经加入MST
for (j = 2; j <= n; j++)
{
if (graph[vnear][j] < distance[j])//将已经加入的新点到其他路径全部遍历一遍,如果发现更近的,则更新,大于等于的都不变
{
distance[j] = graph[vnear][j];
nearest[j] = vnear;
}
}
}
return sum;
}
int main()
{
int i, j, k, m, n;
int cost;
cin >> m >> n;//m=顶点个数,n=边的个数
//初始化图G
for (i = 1; i <= m; i++)
{
for (j = 1; j <= m; j++)
{
graph[i][j] = INF;
}
}
//构建图G
for (k = 1; k <= n; k++)
{
cin >> i >> j >> cost;
graph[i][j] = cost;
graph[j][i] = cost;
}
//求解最小生成树
cout << "V1->";
cost = prim(graph, m);//注意这里传二位参数的方式
cout << "最小权值得和=" << cost << endl;
system("pause");
return 0;
}
Prim算法
最新推荐文章于 2018-06-19 10:33:57 发布