标签:printf 哪些 int 0.00 获得 分析 lin sum return
const double eps=1e-6;
//题目要求保留4位小数,精度可以设为1e-(4+2)
int n,m,f,fa[405];
struct edge{
int x,y,c,t;
double w;//注意边权是实数
}e[10005];
bool cmp(edge x,edge y){return x.w<y.w;}
int find(int x){
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
bool check(double mid){
for(int i=1;i<=m;i++)
e[i].w=e[i].c*1.0+e[i].t*mid;
//每一次check时,根据mid值更新边权
//kruskal跑最小生成树:
sort(e+1,e+m+1,cmp);
for(int i=1;i<=n;i++)fa[i]=i;
int k=0;double now=0;
for(int i=1;i<=m;i++){
int x=find(e[i].x),y=find(e[i].y);
if(x!=y){
k++;
fa[y]=x;
now+=e[i].w;
if(now>f)return 0;
if(k==n-1)break;
}
}
return 1;
}
int main(){
n=read();m=read();f=read();
for(int i=1;i<=m;i++){
e[i].x=read();
e[i].y=read();
e[i].c=read();
e[i].t=read();
}
double l=-1e9,r=1e9,mid;
//注意一下二分边界,因为可能出现利润为负数的情况
while(l+eps<r){//实数域上的二分答案模板
mid=(l+r)/2;
if(check(mid))l=mid;
else r=mid;
}
if(r<0)puts("0.0000");//如果利润为负数
else printf("%.4lf\n",r);
return 0;
}
标签:printf 哪些 int 0.00 获得 分析 lin sum return
原文地址:https://www.cnblogs.com/PPXppx/p/10366851.html