POJ1258Agri-Net

http://poj.org/problem?id=1258

题意 : john当上了镇长,打算给每个农场都连接网络,需要用最小的成本连接其他所有农场,所以要找最少的纤维连在一起,任何两个农场之间的距离不超过十万。输入n,下面有n行n列,代表着每两个农场的距离,对角线为0,因为自己到自己是为0;

解题思路 : 这个题要包含所有的农场,赤果果的最小生成树,这个题的话,注意是多组输入还有数组不要开得太小,算法的话prim和kruskal都可以,我用的是prim。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 int ans,dis[1001][1001];
 7 const int INF = 1<<29 ;
 8 int vis[1001],n,low[1001];
 9 int prim()
10 {
11     memset(vis,0,sizeof(vis));
12     int i,j,flag,min;
13     ans = 0 ;
14     for(i = 1 ; i <= n ; i++)
15     {
16         low[i] = dis[1][i];
17     }
18     vis[1] = 1 ;
19     for(i = 1 ; i <= n ; i++)
20     {
21         min = INF;
22         for(j = 1 ;j <= n ; j++)
23         {
24             if(min > low[j]&&!vis[j])
25             {
26                 min = low[j] ;
27                 flag = j;
28             }
29         }
30         if(min >= INF)
31         {
32             flag = -1 ;
33             break ;
34         }
35         ans+=min ;
36         vis[flag] = 1 ;
37         for(j = 1 ; j <= n ; j++)
38         {
39             if(dis[flag][j] < low[j] && !vis[j])
40             low[j] = dis[flag][j];
41         }
42     }
43     return ans ;
44 }
45 int main()
46 {
47     while(~scanf("%d",&n))
48     {
49         for(int i = 1 ; i <= n ; i++)
50         {
51             for(int j = 1 ; j <= n ; j++)
52             {
53                 cin>>dis[i][j] ;
54             }
55         }
56         ans = prim();
57         cout<<ans<<endl;
58     }
59     return 0 ;
60 }
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3256601.html