POJ 2485 Highways

题目大意是找到一条生成树,使得该树中最大的一条边在所有树中的最大边最小。算是最小生成树的一道变型。由于边数可能比较多,所以用prim算法比较合适。

AC code:

 1 #include <iostream>
2 #include <string.h>
3 #define MAX 1000
4 using namespace std;
5
6 int n, map[MAX][MAX];
7 bool vis[MAX];
8 int dis[MAX];
9 int ans;
10
11 void ini()
12 {
13 int i, j;
14 for(i = 0; i < n; i++)
15 for(j = 0; j < n; j++)
16 scanf("%d", &map[i][j]);
17 }
18 int prim()//当边数较多的时候适合用prim算法
19 {

20 int i, j, temp;
21 ans = 0;
22 memset(vis, false, sizeof(vis));//将点集设为空
23 for(i = 1; i < n; i++)//初始化
24 dis[i] = map[0][i];//用dis数组存外结点到当前图的边的权值
25 vis[0] = true;

26 for(i = 1; i < n; i++)
27 {
28 int min = 0xffffff;
29 for(j = 1; j < n; j++)//找到外结点到当前图的边的权值的最小值
30 if(dis[j] < min && !vis[j])

31 {
32 min = dis[j];
33 temp = j;
34 }
35 vis[temp] = true;//将该点加入图中
36 if(ans < min)

37 ans = min;
38 for(j = 1; j < n; j++)//更新dis数组
39 if(!vis[j] && dis[j] > map[temp][j])

40 dis[j] = map[temp][j];
41 }
42 return ans;
43 }
44
45
46 int main()
47 {
48 int cas;
49 while(scanf("%d", &cas) != EOF)
50 {
51 while(cas--)
52 {
53 scanf("%d", &n);
54 ini();
55 printf("%d\n", prim());
56 }
57 }
58 return 0;
59 }



posted @ 2012-02-24 16:50  背着超人飞  阅读(132)  评论(0)    收藏  举报