POJ 2485

 1 #include<iostream>
 2 #define MAXN 505
 3 #define inf 1000000000
 4 using namespace std;
 5 typedef int elem_t;
 6 int _m[MAXN][MAXN];
 7 int pre[MAXN];
 8 elem_t prim(int n,elem_t mat[][MAXN],int* pre);
 9 int main()
10 {
11     //freopen("acm.acm","r",stdin);
12     int num;
13     int i;
14     int j;
15     int min = inf; 
16     int time;
17     scanf("%d",&time);
18     while(time --)
19     {
20         scanf("%d",&num);
21         min = 0; 
22         for(i = 0; i < num; ++ i)
23         {
24             for(j = 0; j < num; ++ j)
25                 _m[i][j] = inf;
26         }
27         for(i = 0; i < num; ++ i)
28         {
29             for(j = 0; j < num; ++ j)
30             {
31                 scanf("%d",&_m[i][j]);
32             }
33         }
34         prim(num,_m,pre);
35         for(i  = num-1; i >= 0; -- i)
36         {
37             j = i;
38             while(pre[j] != -1)
39             {
40                 if(_m[pre[j]][j] > min)
41                     min = _m[pre[j]][j];
42                 j = pre[j];
43             }
44         }
45         cout<<min<<endl;
46     }
47 }
48 
49 
50 
51 ////////////////////////////////////////////////
52 
53 elem_t prim(int n,elem_t mat[][MAXN],int* pre){
54     elem_t min[MAXN],ret=0;
55     int v[MAXN],i,j,k;
56     for (i=0;i<n;i++)
57         min[i]=inf,v[i]=0,pre[i]=-1;
58     for (min[j=0]=0;j<n;j++){
59         for (k=-1,i=0;i<n;i++)
60             if (!v[i]&&(k==-1||min[i]<min[k]))
61                 k=i;
62         for (v[k]=1,ret+=min[k],i=0;i<n;i++)
63             if (!v[i]&&mat[k][i]<min[i])
64                 min[i]=mat[pre[i]=k][i];
65     }
66     return ret;
67 }
原文地址:https://www.cnblogs.com/gavinsp/p/4568436.html