最小生成树之Prim算法
说明
Prim算法的时间复杂度为O(n^2),适合于求边稠密的网的最小生成树
代码
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define INFINITY 65535
#define maxSize 50
#define OK 1
typedef int VertexType;
typedef int EdgeType;
typedef struct
{
VertexType vexs[maxSize];
EdgeType arc[maxSize][maxSize];
int n, e;
}MGraph;
void CreateMGraph(MGraph &G)
{
int i, j;
int v1, v2, w;
cin >> G.n >> G.e;
for (i = 1; i <= G.n; i++)
{
G.vexs[i] = i;
}
for (i = 1; i <= G.n; i++)
{
for (j = 1; j <= G.n; j++)
{
G.arc[i][j] = G.arc[j][i] = INFINITY;
}
}
for (i = 1; i < G.n; i++)
{
G.arc[i][i] = 0;
}
for (i = 1; i <= G.e; i++)
{
cin >> v1 >> v2 >> w;
G.arc[v1][v2] = G.arc[v2][v1] = w;
}
}
void print(MGraph G)
{
int i, j;
for (i = 1; i <= G.n; i++)
{
for (j = 1; j <= G.n; j++)
{
printf("%d ", G.arc[i][j]);
}
printf("\n");
}
}
void Prim(MGraph G,int v0)
{
int min, i, j, k;
int adjvex[maxSize];
int lowcost[maxSize];
for (i = 1; i <= G.n; i++)
{
lowcost[i] = G.arc[v0][i];
adjvex[i] = v0;
}
for (i = 1; i < G.n; i++)
{
min = INFINITY;
k = 0;
for (j = 1; j <= G.n; j++)
{
if (lowcost[j] != 0 && lowcost[j] < min)
{
min = lowcost[j];
k = j;
}
}
printf("(%d %d)\n", adjvex[k], k);
lowcost[k] = 0;
for (j = 1; j <= G.n; j++)
{
if (lowcost[j] != 0 && G.arc[k][j] < lowcost[j])
{
lowcost[j] = G.arc[k][j];
adjvex[j] = k;
}
}
}
}
int main()
{
MGraph G;
CreateMGraph(G);
print(G);
Prim(G, 4);
return 0;
}
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
Output
0 6 1 5 65535 65535
6 0 5 65535 3 65535
1 5 0 5 6 4
5 65535 5 0 65535 2
65535 3 6 65535 0 6
65535 65535 4 2 6 65535
(4 6)
(6 3)
(3 1)
(3 2)
(2 5)
输入图例
输出图例