这题代码交上去时开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;
}