http://poj.org/problem?id=2485
此题主要是题意要读懂!!
尤其是最后一句话,
For each test case, you should output a line contains an integer, which is the length of the longest road to be built such that all the villages are connected, and this value is minimum.
逐个词翻译,就是求所有支撑树中最大边最小的支撑树的最大边,理解题意后,就会发现求解的就是最小生成树的最大边
并且此题一看就是用prim过,1.数据量很小 2.数据给予的形式也适合prim
当然可以用kruskal过,但是会有许多额外的代码
1 #include<stdio.h>
2 #include<memory.h>
3 #define INF 100000000
4 int map[500][500];
5 int visit[500];
6 int prim(int num)
7 {
8 int sum=0;
9 memset(visit,0,sizeof(visit));
10 visit[0]=1;
11 for(int k=0;k<num-1;k++)
12 {
13 int min=INF,minnum=0;
14 for(int n=0;n<num;n++)
15 if(visit[n])
16 for(int m=0;m<num;m++)
17 if(!visit[m]&&min>map[n][m])
18 minnum=m,min=map[n][m];
19 visit[minnum]=1;
20 sum=sum>min?sum:min;
21 }
22 return sum;
23 }
24 int main()
25 {
26 int sum;
27 scanf("%d",&sum);
28 while(sum--)
29 {
30 int num;
31 scanf("%d",&num);
32 for(int i=0;i<num;i++)
33 for(int j=0;j<num;j++)
34 scanf("%d",&map[i][j]);
35 printf("%d\n",prim(num));
36 }
37 return 0;
38 }