48pts求助
查看原帖
48pts求助
556740
hzx360楼主2023/6/14 18:43
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
const double eps=0.00000001;
int n,m,f,fa[N];
double c[N],t[N];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
struct edge{int x,y;double w;}e[N];
bool cmp(edge A,edge B){return A.w>B.w;}
bool check(double x){
	for(int i=1;i<=m;i++) e[i].w=-c[i]-t[i]*x;
	for(int i=1;i<=n;i++) fa[i]=i;
	sort(e+1,e+1+m,cmp);
	int cnt=0;double all=f*1.0;
	for(int i=1;i<=m;i++){
		int x=e[i].x,y=e[i].y;
		int fx=find(x),fy=find(y);
		if(fx==fy) continue;
		fa[min(fx,fy)]=max(fx,fy);
		all+=e[i].w,cnt++;
		if(cnt==n-1) break;
	}
	double p=(double)(f);
	return all>=0;
}
int main(){
	cin>>n>>m>>f;
	for(int i=1;i<=m;i++){
		int a,b;
		cin>>a>>b>>c[i]>>t[i];
		e[i].x=a,e[i].y=b;
	}
	double l=0,r=1e9,ans=0;
	while(r-l>=eps){
		double mid=(l+r)/2;
		if(check(mid)) ans=mid,l=mid+eps;
		else r=mid-eps;
	}
	printf("%.4lf",ans);
}
2023/6/14 18:43
加载中...