1.prim版本的算法
1: #include<string.h>
2: #define INF 10000001
3: #define N 10001
4: int graph[N][N]; //夹着我们有N个点,这里存的是边(i,j)的花费(无向边)
5: //没有边时的花费就是INF
6: int cost[N]; //记录目前要把第i个点加入正确联盟所需要的花费
7: int last[N]; //记录第i个点是透过谁加入了正确联盟(等于是存在edge(last[i],i))
8: int choosed[N]; //记录是否已经加入正确联盟
9: int fin_cnt; //记录已经加入正确联盟点的个数
10: int total_cost; //记录总花费
11: void init(){
12: int i;
13: memset( choosed , 0 , sizeof(int));
14: //last = -1代表自己就是root,一开始所有点都是自己的parent
15: memset( last , -1 , sizeof(int));
16:
17: //以idx=0的点作为root开始看花费
18: cost[0]=0;
19: choosed[0]=1;
20: for( i = 1 ; i < N ; i++ ){
21: cost[i] = graph[0][i]; //如果有边cost就会是该条边,反之则会是INF
22: if( cost[i] != INF)
23: last[i] = 0;
24: }
25: fin_cnt=1; //一开始只有一个点在正确联盟
26: }
27:
28: void prim(){
29: int min; //用来存这一轮找到的最小花费
30: int min_idx; //用来存这一轮找到最小花费的是哪个点
31: int i;
32: while( fin_cnt < N ){ //如果小于N代表还没找完
33: min = INF; //初始化成INF,用来找最小值
34: min_idx=-1;
35: for( i = 1 ; i < N ; i++ ){ //跑过所有点,找最小值
36: if(choosed[i] == 0&&cost[i]<min){//已经在正确联盟里就不考虑
37: min_idx=i;
38: min=cost[i];
39: }
40: }
41: if( min_idx == -1 ) //如果没有找到就代表此图找不到spanning tree
42: break;
43:
44: choosed[min_idx]=1; //标记min_idx这个店进入了正确联盟
45: total_cost+=cost[min_idx]; //加上加入这个点的cost
46: fin_cnt++; //fin_cnt增加一,代表多了一个点已经确定
47:
48: //看看还有没有被选的点,有没有点能够透过min_idx这个点而更近的
49: for( i = 1 ; i < N ; i++){
50: if(choosed[min_idx] == 0 && graph[min_idx][i]<cost[i]){ //被选过的就跳过,有更近就更新
51: last[i] = min_idx;
52: cost[i] = graph[min_idx][i];
53: }
54: }
55: }
56: }
数据结构与算法分析–Minimum Spanning Tree(最小生成树),布布扣,bubuko.com
数据结构与算法分析–Minimum Spanning Tree(最小生成树)
原文:http://www.cnblogs.com/ZJUT-jiangnan/p/3588560.html