更新之后的代码如下(前一个版本大家看不到,不好意思)

代码
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<memory.h>
4
5 #define MAX_NODE 100
6 #define MAX_EDGE 200
7 #define NO_PARE -1
8 #define NO_EDGE -1
9 #define MAX_INT 0x7fffffff
10
11 /*
12
13 最小堆的相关操作了
14
15 */
16
17 int min_hepify(int graphNode[],int n,int i);
18 int build_min_heap(int graphNode[],int n);
19 /*
20 根据最小堆找到最小元素
21 */
22 int extra_min_node(int graphNode[]);
23 /*
24 最小生成树算法了
25 */
26 void MST_PRIM();
27
28 /*
29 一些全局变量
30 */
31 int graph[MAX_NODE][MAX_NODE];
32 int nodeNum;
33 int graphNode[MAX_NODE];
34 int key[MAX_NODE];
35 int pare[MAX_NODE];
36 int source;
37
38 /*
39 测试函数
40 */
41 int test();
42 int main()
43 {
44 test();
45 return 0;
46 }
47
48 int test()
49 {
50 int i;
51 nodeNum = 9;
52 source = 0;
53 for(i = 0;i<nodeNum;i++)
54 {
55 graphNode[i] = i;
56 }
57 memset(graph,NO_EDGE,sizeof(graph));
58
59 graph[0][1] = 4;
60 graph[1][0] = 4;
61 graph[0][7] = 8;
62 graph[7][0] = 8;
63
64 graph[1][2] = 8;
65 graph[2][1] = 8;
66 graph[1][7] = 11;
67 graph[7][1] = 11;
68
69 graph[2][3] = 7;
70 graph[3][2] = 7;
71 graph[2][8] = 2;
72 graph[8][2] = 2;
73 graph[2][5] = 4;
74 graph[5][2] = 4;
75
76 graph[3][4] = 9;
77 graph[4][3] = 9;
78 graph[3][5] = 14;
79 graph[5][3] = 14;
80
81 graph[4][5] = 10;
82 graph[5][4] = 10;
83
84 graph[5][6] = 2;
85 graph[6][5] = 2;
86
87 graph[6][7] = 1;
88 graph[7][6] = 1;
89 graph[6][8] = 6;
90 graph[8][6] = 6;
91
92 graph[7][8] = 7;
93 graph[8][7] = 7;
94 MST_PRIM();
95 return 0;
96 }
97
98
99 int min_hepify(int node[],int n,int i)
100 {
101 int l,r,least = i;
102 l = 2*i + 1;
103 r = 2*i + 2;
104 if(l<n && key[node[l]] < key[node[least]])
105 least = l;
106 else
107 if( r < n && key[node[r]] < key[node[least]])
108 least = r;
109 if( least != i)
110 {
111 int t = node[least];
112 node[least] = node[i];
113 node[i] = t;
114 min_hepify(node,n,least);
115 }
116 return 0;
117 }
118 int build_min_heap(int node[],int n)
119 {
120 int i;
121 for(i = n/2;i>=0;i--)
122 min_hepify(node,n,i);
123 return 0;
124 }
125
126 int extra_min_node(int graphNode[])
127 {
128 int i = graphNode[0];
129 graphNode[0] = graphNode[nodeNum-1];
130 nodeNum--;
131 min_hepify(graphNode,nodeNum,0);
132 return i;
133 }
134
135 void MST_PRIM()
136 {
137 int u,i,j;
138
139 for(i =0;i<nodeNum;i++)
140 key[i] = MAX_INT;
141 memset(pare,NO_PARE,sizeof(pare));
142 key[source] = 0;
143 build_min_heap(graphNode,nodeNum);
144 while(nodeNum>0)
145 {
146 u = extra_min_node(graphNode);
147
148 for(i = 0;i<nodeNum;i++)
149 {
150 if(graph[u][graphNode[i]]!=NO_EDGE && key[graphNode[i]] > graph[u][graphNode[i]])
151 {
152 pare[graphNode[i]] = u;
153 key[graphNode[i]] = graph[u][graphNode[i]];
154
155 for(j = i;j>=0;j--)
156 {
157 min_hepify(graphNode,nodeNum,j);
158 }
159 }
160 }
161 }
162 return;
163 }
164
165
2 #include<stdlib.h>
3 #include<memory.h>
4
5 #define MAX_NODE 100
6 #define MAX_EDGE 200
7 #define NO_PARE -1
8 #define NO_EDGE -1
9 #define MAX_INT 0x7fffffff
10
11 /*
12
13 最小堆的相关操作了
14
15 */
16
17 int min_hepify(int graphNode[],int n,int i);
18 int build_min_heap(int graphNode[],int n);
19 /*
20 根据最小堆找到最小元素
21 */
22 int extra_min_node(int graphNode[]);
23 /*
24 最小生成树算法了
25 */
26 void MST_PRIM();
27
28 /*
29 一些全局变量
30 */
31 int graph[MAX_NODE][MAX_NODE];
32 int nodeNum;
33 int graphNode[MAX_NODE];
34 int key[MAX_NODE];
35 int pare[MAX_NODE];
36 int source;
37
38 /*
39 测试函数
40 */
41 int test();
42 int main()
43 {
44 test();
45 return 0;
46 }
47
48 int test()
49 {
50 int i;
51 nodeNum = 9;
52 source = 0;
53 for(i = 0;i<nodeNum;i++)
54 {
55 graphNode[i] = i;
56 }
57 memset(graph,NO_EDGE,sizeof(graph));
58
59 graph[0][1] = 4;
60 graph[1][0] = 4;
61 graph[0][7] = 8;
62 graph[7][0] = 8;
63
64 graph[1][2] = 8;
65 graph[2][1] = 8;
66 graph[1][7] = 11;
67 graph[7][1] = 11;
68
69 graph[2][3] = 7;
70 graph[3][2] = 7;
71 graph[2][8] = 2;
72 graph[8][2] = 2;
73 graph[2][5] = 4;
74 graph[5][2] = 4;
75
76 graph[3][4] = 9;
77 graph[4][3] = 9;
78 graph[3][5] = 14;
79 graph[5][3] = 14;
80
81 graph[4][5] = 10;
82 graph[5][4] = 10;
83
84 graph[5][6] = 2;
85 graph[6][5] = 2;
86
87 graph[6][7] = 1;
88 graph[7][6] = 1;
89 graph[6][8] = 6;
90 graph[8][6] = 6;
91
92 graph[7][8] = 7;
93 graph[8][7] = 7;
94 MST_PRIM();
95 return 0;
96 }
97
98
99 int min_hepify(int node[],int n,int i)
100 {
101 int l,r,least = i;
102 l = 2*i + 1;
103 r = 2*i + 2;
104 if(l<n && key[node[l]] < key[node[least]])
105 least = l;
106 else
107 if( r < n && key[node[r]] < key[node[least]])
108 least = r;
109 if( least != i)
110 {
111 int t = node[least];
112 node[least] = node[i];
113 node[i] = t;
114 min_hepify(node,n,least);
115 }
116 return 0;
117 }
118 int build_min_heap(int node[],int n)
119 {
120 int i;
121 for(i = n/2;i>=0;i--)
122 min_hepify(node,n,i);
123 return 0;
124 }
125
126 int extra_min_node(int graphNode[])
127 {
128 int i = graphNode[0];
129 graphNode[0] = graphNode[nodeNum-1];
130 nodeNum--;
131 min_hepify(graphNode,nodeNum,0);
132 return i;
133 }
134
135 void MST_PRIM()
136 {
137 int u,i,j;
138
139 for(i =0;i<nodeNum;i++)
140 key[i] = MAX_INT;
141 memset(pare,NO_PARE,sizeof(pare));
142 key[source] = 0;
143 build_min_heap(graphNode,nodeNum);
144 while(nodeNum>0)
145 {
146 u = extra_min_node(graphNode);
147
148 for(i = 0;i<nodeNum;i++)
149 {
150 if(graph[u][graphNode[i]]!=NO_EDGE && key[graphNode[i]] > graph[u][graphNode[i]])
151 {
152 pare[graphNode[i]] = u;
153 key[graphNode[i]] = graph[u][graphNode[i]];
154
155 for(j = i;j>=0;j--)
156 {
157 min_hepify(graphNode,nodeNum,j);
158 }
159 }
160 }
161 }
162 return;
163 }
164
165
浙公网安备 33010602011771号