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 }