整理板子的时候翻出来的题,Kruskal板子题。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<string>
 7 #include<stack>
 8 #include<queue>
 9 #include<vector>
10 #include<cstdlib>
11 //#include<windows.h>
12 #define first fi
13 #define second se
14 using namespace std;
15 typedef long long ll;
16 const int N = 1e6+10;
17 const int INF = 0x3f3f3f3f;
18 const int inf = - INF;
19 const int mod = 1e9+7;
20 const double pi = acos(-1.0);
21 int n,m;
22 int father[505];
23 void init(){
24     m=0;
25     memset(father,-1,sizeof(father));
26 }
27 struct node {
28     int u,v,w;
29     node(){}
30     node(int u,int v, int w):u(u),v(v),w(w){}
31     bool operator < (const node &rhs)const{
32         return w < rhs.w;
33     }
34 }edge[N];
35 int Find(int x){
36     return father[x]==-1?x:father[x]=Find(father[x]);
37 }
38 int Kruskal(){
39     int maxn=-1;
40     int cnt=0;
41     for(int i=0;i<m;i++){
42         int u=edge[i].u;
43         int v=edge[i].v;
44         if(Find(u)!=Find(v)){
45             father[Find(u)]=Find(v);
46             maxn=max(maxn,edge[i].w);
47             if(++cnt>=n-1) return maxn;
48         }
49     }
50     return -1;
51 }
52 int main(){
53     int T;
54     scanf("%d",&T);
55     while(T--){
56         scanf("%d",&n);
57         init();
58         int t;
59         for(int i=1;i<=n;i++){
60             for(int j=1;j<=n;j++){
61                 scanf("%d",&t);
62                 edge[m++]=node(i,j,t);
63             }
64         }
65         sort(edge,edge+m);
66         printf("%d\n",Kruskal());
67     }
68     //system("pause");
69     return 0;
70 }
12-31 15:47