POJ2485Highways

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

题意 : 这道题和1258很像,但是这道题求的是最小生成树中最大的那条边,所以在函数里处理一下就行了。

思路 : 赤裸裸的最小生成树啊,但是这道题一定要注意,因为底下有提醒,一定要用scanf输入,结果我就很悲剧的没看到啊,然后一直改一直改,到最后又去看了一遍题才发现要用scanf啊,╮(╯▽╰)╭

 1 #include<cstdio>

 2 #include<cstring>

 3 #include<iostream>

 4 #include<algorithm>

 5 using namespace std;

 6 int ans,dis[5005][5005];

 7 const int INF = 1<<29 ;

 8 int vis[50005],n,low[50005];

 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     //low[1] = 0;

19     vis[1] = 1 ;

20     for(i = 2 ; i <= n ; i++)

21     {

22         min = INF;

23         for(j = 1 ;j <= n ; j++)

24         {

25             if(min > low[j]&&!vis[j])

26             {

27                 min = low[j] ;

28                 flag = j;

29             }

30         }

31         /*if(min >= INF)

32         {

33             flag = -1 ;

34             break ;

35         }*/

36         if(ans < min)

37         ans = min ;

38         //ans+=min ;

39         vis[flag] = 1 ;

40         for(j = 1 ; j <= n ; j++)

41         {

42             if(dis[flag][j] < low[j] && !vis[j])

43             low[j] = dis[flag][j];

44         }

45     }

46     return ans ;

47 }

48 int main()

49 {

50     int s;

51     scanf("%d",&s);

52     while(s--)

53     {

54         scanf("%d",&n);

55         for(int i = 1 ; i <= n ; i++)

56         {

57             for(int j = 1 ; j <= n ; j++)

58             {

59                 scanf("%d",&dis[i][j]);

60             }

61         }

62         ans = prim();

63         cout<<ans<<endl;

64     }

65     return 0 ;

66 }
View Code

 

 

你可能感兴趣的:(poj)