灌溉 最小生成树

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 int sum;
 5 int map[101][101];
 6 bool vis[101];
 7 int des[101];
 8 
 9 void prim(int v,int e)
10 {
11     int i,j;
12     memset(vis,0,sizeof(vis));
13     for(i=1;i<=v;i++)
14         des[i]=map[1][i];
15     vis[1]=1;
16     des[1]=0;
17     int num=1;
18     while(num<v)
19     {
20         int min=999999,k;
21         for(i=2;i<=v;i++)
22         {
23             if(des[i]<min&&vis[i]==0)
24             {
25                 min=des[i]; k=i;
26             }
27         }
28         sum+=min;
29         vis[k]=1;
30         num++;
31         for(i=2;i<=v;i++)
32             if(map[k][i]<des[i]&&vis[i]==0)
33             des[i]=map[k][i];
34     }
35 }
36         
37 
38 int main()
39 {
40     int n;
41     scanf("%d",&n);
42     for(int i=1;i<=n;i++)
43         for(int j=1;j<=n;j++)
44     {
45         scanf("%d",map[i]+j);
46     }
47     int e=0;
48     for(int  i=1;i<=n;i++)
49         for(int j=1;j<=j;j++)
50         if(map[i][j])
51             e++;
52     sum=0;
53     prim(n,e);
54     printf("%d
",sum);
55     return 0;
56 }
57     
原文地址:https://www.cnblogs.com/WDKER/p/5481960.html