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

 

 

posted on 2013-08-14 13:57  枫、  阅读(277)  评论(0编辑  收藏  举报