刚开始没懂样例,看了discuss才知道.这个题就是考Kruskal.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define inf 99999999
const int maxn = 1010;
using namespace std;
struct edge{
int l,r,w;
}ee[maxn*maxn/2];
int map[maxn][maxn],rt[maxn],path[maxn][2];
int nedge;
bool flag[maxn];
bool Cmp(edge a, edge b) {return a.w < b.w;}
void Build(int n){
for(int i = 1; i <= n; ++i)
rt[i] = i;
}
int Find(int x){
if(rt[x] == x) return x;
return Find(rt[x]);
}
void Union(int x,int y){
int rt1 = rt[x];
int rt2 = rt[y];
if(rt1 != rt2)
rt[rt1] = rt2;
}
void Kruskal(int n){
int rt1,rt2;
int k = 0,ans = -1;
for(int i = 0; i < nedge; ++i){
rt1 = Find(ee[i].l);
rt2 = Find(ee[i].r);
if(rt1 != rt2){
Union(rt1,rt2);
path[k][0] = ee[i].l;
path[k][1] = ee[i].r;
k++;
if(ans < ee[i].w) ans = ee[i].w;
if(k == n) break;
}
}
printf("%d\n%d\n",ans,n-1);
for(int i = 0; i < k; ++i)
printf("%d %d\n",path[i][0],path[i][1]);
}
int main()
{
int n;
while(~scanf("%d",&n)){
Build(n);
int m;
scanf("%d",&m);
nedge = 0;
while(m--){
int a,b,len;
scanf("%d %d %d",&a,&b,&len);
ee[nedge].l = a;
ee[nedge].r = b;
ee[nedge].w = len;
nedge++;
}
sort(ee,ee+nedge,Cmp);
Kruskal(n);
}
return 0;
}