更多内容可以参考《算法导论(第二版)》.
1
#include<stdio.h>2
#include<stdlib.h>3
#include<memory.h>4

/**//*5
实现无向图中的最小生成树算法Prime6
*/7
#define MAX_NODE 100 /*最大节点数*/8
#define MAX_EDGE 200 /*最大边数*/9
#define NO_PARE -110
#define NO_EDGE -111
#define MAX_INT 0x7fffffff12

13

/**//*用有限对实现最小队列*/14
int min_hepify(int graphNode[],int n,int i);15
int build_min_heap(int graphNode[],int n);16
int extra_min_node(int graphNode[]);17

void MST_PRIM();/**//*最小生成树*/18

19

/**//*下面定义一些全局变量*/20

int graph[MAX_NODE][MAX_NODE];/**//*邻接矩阵*/21

int nodeNum;/**//*实际的节点数目*/22

int graphNode[MAX_NODE];/**//*图中的节点数目,用优先队列实现*/23

int key[MAX_NODE];/**//*每个节点和当前key值,也就是和MST中的点的距离*/24

int pare[MAX_NODE];/**//*当然是每个点的父节点了*/25

int source;/**//*定义起始节点*/26

27

28

int test();/**//*测试函数*/29
int main()30


{31
test();32
return 0;33
}34

/**//*生成测试函数*/35
int test()36


{37
int i;38
nodeNum = 9;39
source = 0;40
for(i = 0;i<nodeNum;i++)41

{42
graphNode[i] = i;43
}44
memset(graph,NO_EDGE,sizeof(graph));45

/**//*图中权重,注意是无向图*/46
graph[0][1] = 4;47
graph[1][0] = 4;48
graph[0][7] = 8;49
graph[7][0] = 8;50

51
graph[1][2] = 8;52
graph[2][1] = 8;53
graph[1][7] = 11;54
graph[7][1] = 11;55

56
graph[2][3] = 7;57
graph[3][2] = 7;58
graph[2][8] = 2;59
graph[8][2] = 2;60
graph[2][5] = 4;61
graph[5][2] = 4;62

63
graph[3][4] = 9;64
graph[4][3] = 9;65
graph[3][5] = 14;66
graph[5][3] = 14;67

68
graph[4][5] = 10;69
graph[5][4] = 10;70
71
graph[5][6] = 2;72
graph[6][5] = 2;73
74
graph[6][7] = 1;75
graph[7][6] = 1;76
graph[6][8] = 6;77
graph[8][6] = 6;78
79
graph[7][8] = 7;80
graph[8][7] = 7;81
MST_PRIM();82
return 0;83
}84

85

/**//*根据key中的值来维持heap属性*/86
int min_hepify(int node[],int n,int i)87


{88
int l,r,least = i;89
l = 2*i + 1;90
r = 2*i + 2;91
if(l<n && key[node[l]] < key[node[least]])92
least = l;93
else94
if( r < n && key[node[r]] < key[node[least]])95
least = r;96
if( least != i)97

{98
int t = node[least];99
node[least] = node[i];100
node[i] = t;101
min_hepify(node,n,least);102
}103
return 0;104
}105
int build_min_heap(int node[],int n)106


{107
int i; 108
for(i = n/2;i>=0;i--)109
min_hepify(node,n,i);110
return 0;111
}112

/**//*得到图中key最小的那个节点,并且要维护最小堆的性质*/113
int extra_min_node(int graphNode[])114


{115
int i = graphNode[0];116
graphNode[0] = graphNode[nodeNum-1];117
nodeNum--;118
min_hepify(graphNode,nodeNum,0);119
return i;120
}121

/**//*调用这个函数之前假设图已经建立起来了,也就是nodeNum,graph,和graphNode以及source122
已经完成了初始化123
*/124
void MST_PRIM()125


{126
int u,i,j;127

/**//*memset(key,MAX_INT,sizeof(key));*/128
for(i =0;i<nodeNum;i++)129
key[i] = MAX_INT;130
memset(pare,NO_PARE,sizeof(pare));131
key[source] = 0;132

build_min_heap(graphNode,nodeNum);/**//*其实这里几乎没有做任何工作可以用代码 exchage(graphNode[0],graphNode[source])来代替该函数的执行*/133
while(nodeNum>0)134

{135
u = extra_min_node(graphNode);136

/**//*对于u的每一个邻居都要更新它的key值*/137
for(i = 0;i<nodeNum;i++)138

{139
if(graph[u][graphNode[i]]!=NO_EDGE && key[graphNode[i]] > graph[u][graphNode[i]])140

{141
pare[graphNode[i]] = u;142
key[graphNode[i]] = graph[u][graphNode[i]];143

/**//*下面维持最小堆的性质,从节点i开始遭到破坏*/144
for(j = i;j>=0;j--)145

{146
min_hepify(graphNode,nodeNum,j);147
}148
}149
}150
}151
return;152
}
浙公网安备 33010602011771号