//最小生成树算法——Prim算法
/*
6 9
0 1 34
1 4 12
0 5 19
5 4 26
0 2 46
2 5 25
5 3 35
3 4 38
2 3 17
*/
#include <iostream>
using namespace std;
int ver_num,edge_num;
int Graph[100][100];
int adjvex[100],lowcost[100];
void CreateGraph()
{
for(int i=0;i<edge_num;i++)
{
int ver1,ver2,weight;
cin>>ver1>>ver2>>weight;
Graph[ver1][ver2]=weight;
Graph[ver2][ver1]=weight;
}
}
int FindMinPos()
{
int min_pos=0;
for(int i=1;i<ver_num;i++)
{
if(lowcost[min_pos]>lowcost[i]&&lowcost[i]!=0)
{
min_pos=i;
}
}
cout<<lowcost[min_pos]<<" ";
return min_pos;
}
void Prim(int v)
{
for(int i=0;i<ver_num;i++)
{
lowcost[i]=Graph[0][i];
}
for(int t=1;t<ver_num;t++)
{
int min_pos=FindMinPos();
for(int i=1;i<ver_num;i++)
{
lowcost[i]=min(lowcost[i],Graph[min_pos][i]);
}
lowcost[min_pos]=0;
}
}
int main()
{
cin>>ver_num>>edge_num;
//memset(Graph,10000,sizeof(Graph));
for(int i=0;i<ver_num;i++)
{
for(int j=0;j<ver_num;j++)
{
Graph[i][j]=10000;
}
}
CreateGraph();
Prim(0);
return 0;
}
【输入数据】
6 9
0 1 34
1 4 12
0 5 19
5 4 26
0 2 46
2 5 25
5 3 35
3 4 38
2 3 17
【输出数据】
为了更好的减小记忆量故不使用adjvex数组存储边上的另一个点,输出的是最小生成树的各边权值。