附上代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=7e4+11,maxm=7e4+100;
int n,k,m,fa[maxn],ans1,used[maxm];
struct edge{
int num,u,v,w1,w2;
}e[maxm];
int find(int x){
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
int cmp1(edge a,edge b){
return a.w1<a.w1;
}
int cmp2(edge a,edge b){
return a.w2<b.w2;
}
int main(){
cin>>n>>k>>m;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m-1;i++)
cin>>e[i].u>>e[i].v>>e[i].w1>>e[i].w2,e[i].num=i;
sort(e+1,e+1+m-1,cmp1);
int s=0;
for(int i=1;i<=m-1;i++){
int fu=find(e[i].u),fv=find(e[i].v);
if(fu!=fv){
fa[fu]=fv;
ans1=max(ans1,e[i].w1);
s++;
used[e[i].num]=1;
if(s==k) break;
}
}
sort(e+1,e+1+m-1,cmp2);
for(int i=1;i<=m-1;i++){
int fu=find(e[i].u),fv=find(e[i].v);
if(fu!=fv&&used[e[i].num]==0){
fa[fu]=fv;
ans1=max(ans1,e[i].w2);
used[e[i].num]=2;
}
}
cout<<ans1<<'\n';
for(int i=1;i<=m-1;i++){
if(used[i]) cout<<i<<' '<<used[i]<<'\n';
}
return 0;
}
附上输出
6
1 1
2 1
4 2
(此处输出应该是符合题意的)