并查集水题。在求最小生成树的同时要求最大边长度最小,kruskal算法应用。
下面是代码:360K+94MS
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#define Max 1010
//#define Inf 10000010
#define Maxx(a,b) (a)>(b)?(a):(b)
#define Min(a,b) (a)<(b)?(a):(b)
using namespace std;
int set[Max];
struct Node{
int from,to;
int value;
}node[20*Max];
bool flag[20*Max];
int n,m;
bool cmp(const struct Node p,const struct Node q){
return p.value<q.value;
}
int find(int x){
int j=x;
while(set[x]!=x)
x=set[x];
int temp;
while(j!=x){
temp=set[j];
set[j]=x;
j=temp;
}
return x;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
set[i]=i;
int a,b,value,pivot=0;;
while(m--){
scanf("%d%d%d",&a,&b,&value);
node[pivot].from=a;
node[pivot].to=b;
node[pivot++].value=value;
}
memset(flag,0,sizeof(flag));
sort(node,node+pivot,cmp);
int ans=0;
int max_int=-1;
for(int i=0;i<pivot;i++){
int x=find(node[i].from);
int y=find(node[i].to);
if(x!=y){
set[Maxx(x,y)]=Min(x,y);
ans+=node[i].value;
if(node[i].value>max_int) //求最大边
max_int=node[i].value;
flag[i]=true;
}
}
printf("%d\n%d\n",max_int,n-1);
for(int i=0;i<pivot;i++) //输出最小生成树边的信息
if(flag[i])
printf("%d %d\n",node[i].from,node[i].to);
return 0;
}