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\n",ans);
55 }
56 return 0;
57 }
#include <stdio.h>
#include <string.h>
#define MaxInt 0x3f3f3f3f