1 #include<cstdio>
2 #include<algorithm>
3 const int maxn=1e4+10;
4 const int maxm=2e4+10;
5 int n,k,m;
6 struct edge1{int a,b,c;}e1[maxm];
7 struct edge2{int a,b,c;}e2[maxm];
8 bool comp1(edge1 a,edge1 b){return a.c<b.c;}
9 bool comp2(edge2 a,edge2 b){return a.c<b.c;}
10 int f[maxn],now;
11 int ff(int k){return f[k]==k?k:f[k]=ff(f[k]);}
12 bool check(int x){
13 for(int i=1;i<=n;i++) f[i]=i;now=0;
14 for(int i=1;i<=m;i++) if(e1[i].c<=x&&(ff(e1[i].a)!=ff(e1[i].b))) f[f[e1[i].b]]=f[f[e1[i].a]],now++;
15 if(now<k) return 0;
16 for(int i=1;i<=m;i++) if(e2[i].c<=x&&(ff(e2[i].a)!=ff(e2[i].b))) f[f[e2[i].b]]=f[f[e2[i].a]],now++;
17 if(now<n-1) return 0;
18 return 1;
19 }
20 int main(){
21 scanf("%d%d%d",&n,&k,&m);
22 int a,b,c1,c2;
23 for(int i=1;i<m;i++){
24 scanf("%d%d%d%d",&a,&b,&c1,&c2);
25 e1[i]=(edge1){a,b,c1};
26 e2[i]=(edge2){a,b,c2};
27 }
28 std::sort(e1+1,e1+m,comp1);
29 std::sort(e2+1,e2+m,comp2);
30 int l=1,r=3e4,mid;
31 while(l<r){
32 mid=l+r>>1;
33 if(check(mid)) r=mid;
34 else l=mid+1;
35 }
36 printf("%d\n",l);
37 return 0;
38 }
1 #include<cstdio>
2 #include<algorithm>
3
4 const int maxn=1e4+10;
5 const int maxm=2e4+10;
6
7 int n,k,m;
8 struct edge1{int t,a,b,c;}e1[maxm];
9 struct edge2{int t,a,b,c;}e2[maxm];
10 bool comp1(edge1 a,edge1 b){return a.c<b.c;}
11 bool comp2(edge2 a,edge2 b){return a.c<b.c;}
12
13 int f[maxn],now;
14 int ff(int k){return f[k]==k?k:f[k]=ff(f[k]);}
15 bool check(int x){
16 for(int i=1;i<=n;i++) f[i]=i;now=0;
17 for(int i=1;i<=m;i++) if(e1[i].c<=x&&(ff(e1[i].a)!=ff(e1[i].b))) f[f[e1[i].b]]=f[f[e1[i].a]],now++;
18 if(now<k) return 0;
19 for(int i=1;i<=m;i++) if(e2[i].c<=x&&(ff(e2[i].a)!=ff(e2[i].b))) f[f[e2[i].b]]=f[f[e2[i].a]],now++;
20 if(now<n-1) return 0;
21 return 1;
22 }
23 int ans[maxm];
24
25 int main(){
26 scanf("%d%d%d",&n,&k,&m);
27 int a,b,c1,c2;
28 for(int i=1;i<m;i++){
29 scanf("%d%d%d%d",&a,&b,&c1,&c2);
30 e1[i]=(edge1){i,a,b,c1};
31 e2[i]=(edge2){i,a,b,c2};
32 }
33 std::sort(e1+1,e1+m,comp1);
34 std::sort(e2+1,e2+m,comp2);
35 int l=1,r=3e4,mid;
36 while(l<r){
37 mid=l+r>>1;
38 if(check(mid)) r=mid;
39 else l=mid+1;
40 }
41 for(int i=1;i<=n;i++) f[i]=i;
42 for(int i=1;i<m;i++) if(e1[i].c<=l&&(ff(e1[i].a)!=ff(e1[i].b))) f[f[e1[i].b]]=f[f[e1[i].a]],ans[e1[i].t]=1;
43 for(int i=1;i<m;i++) if(e2[i].c<=l&&(ff(e2[i].a)!=ff(e2[i].b))) f[f[e2[i].b]]=f[f[e2[i].a]],ans[e2[i].t]=2;
44 printf("%d\n",l);
45 for(int i=1;i<m;i++) if(ans[i]) printf("%d %d\n",i,ans[i]);
46 return 0;
47 }