???奇怪的数据(只能过80分)
查看原帖
???奇怪的数据(只能过80分)
445896
I_m_FW楼主2021/10/19 21:56

二分时改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;
}
2021/10/19 21:56
加载中...