kruskal算法:
// ShellDawn
// POJ1861
// No.5
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MM(x) memset(x,0,sizeof(x))
using namespace std;
#define maxn 1005
#define maxm 15005
int n,m;
struct Node{
int a;
int b;
int v;
};
Node E[maxm];
int fa[maxn];
int ans[maxn][2];
int cnt = 0;
bool cmp(const Node& x,const Node& y){
if(x.v < y.v) return true;
return false;
}
int findfa(const int& x){
int y = x;
while(fa[y] != y) y = fa[y];
int z = y;
y = x;
while(fa[y] != y){
int t = fa[y];
fa[y] = z;
y = t;
}
return z;
}
bool join(const int& x,const int& y){
int fx = findfa(x);
int fy = findfa(y);
if(fx == fy) return false;
if(fx > fy) swap(fx,fy);
fa[fy] = fx;
return true;
}
void solve(){
int num = n;
for(int i=0;i<m;i++){
if(join(E[i].a,E[i].b)){
num --;
ans[cnt][0] = E[i].a;
ans[cnt][1] = E[i].b;
cnt++;
}
if(num == 1){
printf("%d\n%d\n",E[i].v,n-1);
break;
}
}
for(int i=0;i<cnt;i++){
printf("%d %d\n",ans[i][0],ans[i][1]);
}
}
int main(){
while(~scanf("%d%d",&n,&m)){
cnt = 0;
for(int i=0;i<=n;i++) fa[i] = i;
for(int i=0;i<m;i++){
scanf("%d%d%d",&E[i].a,&E[i].b,&E[i].v);
}
sort(E,E+m,cmp);
solve();
}
return 0;
}