最小生成树(MST)分析

Prim算法:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define MaxInt 0x3f3f3f3f
 4 #define N 110
 5 //创建map二维数组储存图表,low数组记录每2个点间最小权值,visited数组标记某点是否已访问
 6 int map[N][N],low[N],visited[N];
 7 int n;
 8 int prim()
 9 {
10     int i,j,pos,min,result=0;
11     memset(visited,0,sizeof(visited));
12 //从某点开始,分别标记和记录该点
13     visited[1]=1;pos=1;
14 //第一次给low数组赋值
15     for(i=1;i<=n;i++)
16         if(i!=pos) low[i]=map[pos][i];
17 //再运行n-1次
18     for(i=1;i<n;i++)
19     {
20 //找出最小权值并记录位置
21      min=MaxInt;
22      for(j=1;j<=n;j++)
23          if(visited[j]==0&&min>low[j])
24          {
25              min=low[j];pos=j;
26          }
27 //最小权值累加
28     result+=min;
29 //标记该点
30     visited[pos]=1;
31 //更新权值
32     for(j=1;j<=n;j++)
33         if(visited[j]==0&&low[j]>map[pos][j])
34             low[j]=map[pos][j];
35     }
36     return result;
37 }
38  
39 int main()
40 {
41     int i,v,j,ans;
42     while(scanf("%d",&n)!=EOF)
43     {
44 //所有权值初始化为最大
45         memset(map,MaxInt,sizeof(map));
46         for(i=1;i<=n;i++)
47             for(j=1;j<=n;j++)
48             {
49                 scanf("%d",&v);
50                 map[i][j]=map[i][j]=v;
51             }
52             ans=prim();
53             printf("%d\n",ans);
54     }
55     return 0;
56 }

Kruskal 算法:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 const int inf = 0x7fffffff;
 5 int st[110], rank[110], N, M, x, y, val, maxN, map[110][110];
 6 struct Edge {
 7     int x, y, val;
 8 }e[10000];
 9 int cmp ( const void *a, const void *b ) {
10     return (( Edge * )a)->val - ( ( Edge * )b )->val;    
11 }
12 int find ( int i ) {
13     return i == st[i] ? i : st[i] = find ( st[i] );    
14 }
15 void merge ( int x, int y ) {
16     int a = find ( x ), b = find ( y ); 
17     if ( a != b ) {
18         st[a] = b;
19         rank[b] += rank[a];    
20         //maxN >?= rank[b];
21         if ( maxN < rank[b] ) maxN = rank[b];
22     }
23 }
24 int Kruskal () {
25     int sum = 0;
26     for ( int i = 0 ; i < N; ++ i ) {
27         int x = e[i].x, y = e[i].y, val = e[i].val;
28         if ( find ( x ) != find ( y ) ) {
29             sum += val;
30             merge ( x, y );    
31         }    
32     }    
33     return sum;
34 }
35 int main()
36 {
37     while ( scanf ( "%d%d", &N, &M ) != EOF && N ) {
38         maxN = 0;
39         for ( int i = 0; i <= M; ++ i ) {
40             st[i] = i;
41             rank[i] = 1;
42             for ( int j = 0; j <= M ; ++ j ) {
43                 map[i][j] = inf;    
44             }    
45         }
46         for ( int i = 0; i < N; ++ i ) {
47             scanf ( "%d%d%d", &x, &y, &val );
48             //map[x][y] = map[y][x] = val;
49             e[i].x = x, e[i].y = y, e[i].val = val;    
50         }     
51         qsort ( e, N, sizeof ( e[0] ), cmp ); puts(" --------------------->");
52         int res = Kruskal ();
53         if ( maxN < M ) puts ( "?" );
54         else printf ( "%d\n", res );
55     }
56 //    system("pause");
57     return 0;
58 
59 }

 end;

posted @ 2014-06-05 20:54  tt_tt--->  阅读(186)  评论(0编辑  收藏  举报