开O2不过,没开就过了,玄关求助QWQ
查看原帖
开O2不过,没开就过了,玄关求助QWQ
1073078
iamjcer楼主2024/8/13 21:26

这题代码交上去时开O2反而全Wa了,没开就AC了,想问问是什么问题? 代码如下:

#include<bits/stdc++.h>
#define N 405
#define M 100005
using namespace std;
struct node{
	int u,v,t,c;
	double w;
}e[M];
int n,m,f,fa[N],u1[M],v1[M],t1[M],c1[M];
double ans=0;
int find_root(int x){
	if(fa[x]==x) return x;
	else return fa[x]=find_root(fa[x]);
}
bool cmp(node x,node y){
	return x.w<y.w;
}
bool check(double x){
	for(int i=1;i<=m;i++) {
		e[i].u=u1[i],e[i].v=v1[i],e[i].c=c1[i],e[i].t=t1[i],e[i].w=(double)e[i].t*1.0*x*1.0+(double)e[i].c*1.0;
	}
	for(int i=1;i<=n;i++) fa[i]=i;
	sort(e+1,e+1+m,cmp);
	double res=0.0;
	int num=0;
	for(int i=1;i<=m;i++){
		int a=e[i].u,b=e[i].v;
		int finda=find_root(a);
		int findb=find_root(b);
		if(finda!=findb){
			++num;
			fa[finda]=findb;
			res+=e[i].w;
			if(num==n-1) break;
		}
	}
	return ((double)f-res)>=0.0;
}
int main(){
	scanf("%lld %lld %lld",&n,&m,&f);
	for(int i=1;i<=m;i++){
		scanf("%lld %lld %lld %lld",&u1[i],&v1[i],&c1[i],&t1[i]);
		e[i]={u1[i],v1[i],c1[i],t1[i]};
	}
	double l=0.0,r=1e12;
	while(r-l>=1e-8){
		double mid=(l+r)/2;
		if(check(mid)){
			ans=mid;
			l=mid;
		}else{
			r=mid;
		}	
	}
	printf("%.4lf",ans);
	return 0;
}
2024/8/13 21:26
加载中...