最小生成树(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;