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

 

你可能感兴趣的:(poj)