二分时改r(r>30000)分不一样
#include <bits/stdc++.h>
using namespace std;
const int N=10010,M=20010;
int n,k,m,f[M],mm,op;
struct node{
int x,y,z1,z2,bj;
}a[M];
struct nn{
int bj,d;
}ans[M];
bool cmp(node aa,node bb){
return aa.z1<bb.z1;
}
bool cnm(nn ay,nn by){
return ay.bj<by.bj;
}
int get(int a){
if(f[a]==a)return a;
return f[a]=get(f[a]);
}
bool krus(int mid){
int res=0;
for(int i=1;i<=mm;i++){
int x=get(a[i].x);
int y=get(a[i].y);
if(x==y)continue;
if(a[i].z1>mid){
if(a[i].z2>mid)continue;
++op;
ans[op].bj=a[i].bj;
ans[op].d=2;
}else {
res++;++op;
ans[op].bj=a[i].bj;
ans[op].d=1;
}
f[x]=y;
}
if(res<k||op!=n-1)return false;
else return true;
}
int main(){
cin>>n>>k>>m;
if(k<0)k=0;
if(k>n-1)k=n-1;
int l=0,r=30010;
for(int i=1;i<m;i++){
int ux,uy,uz1,uz2;
scanf("%d %d %d %d",&ux,&uy,&uz1,&uz2);
a[i].x=ux;a[i].y=uy;a[i].z1=max(uz1,uz2);a[i].z2=min(uz2,uz1);
//l=min(z2,l);r=max(z1,r);
a[i].bj=i;
}
if(m==2){
int fw=2;
if(k==1){
cout<<a[1].z1;
fw=1;
}else cout<<a[1].z2;
puts("");
cout<<1<<' '<<fw;return 0;
}
mm=m-1;
sort(a+1,a+m,cmp);
while(l<r){
op=0;
for(int i=1;i<=m;i++)f[i]=i;
int mid=(r+l)/2;
if(krus(mid))r=mid;
else l=mid+1;
}
cout<<l<<endl;
sort(ans+1,ans+n,cnm);
for(int i=1;i<=n-1;i++){
printf("%d %d\n",ans[i].bj,ans[i].d);
}
return 0;
}