prime

 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
 
原文地址:https://www.cnblogs.com/hutonm/p/5496239.html