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