60ptsRE求助
查看原帖
60ptsRE求助
351679
shaun2000楼主2024/9/20 18:22
#include<bits/stdc++.h>

using namespace std;

int fa[1005];
int getfa(int x)
{
    if(fa[x]==x)
        return x;
    else
    {
        return fa[x]=getfa(fa[x]);
    }
}

int book[1005];
int u[1005],v[1005],w[1005],t[1005],n,m,f;

struct qwq{
    int id;
    double c;
}q[10005];
bool cmp(qwq a,qwq b)
{
    return a.c<b.c;
}


bool check(double x)
{

    for(int i=1;i<=n;i++)
        fa[i]=i;
    for(int i=1;i<=m;i++)
        q[i].id=i,q[i].c=1.0*w[i]+1.0*x*t[i];
//    for(int i=1;i<=m;i++)
//        q.push(make_pair((1.0*w[i]+1.0*x*t[i]),i));
    sort(q+1,q+m+1,cmp);
    double ans=0;
    int cnt=0;
    for(int i=1;i<=m;i++)
    {
        int id=q[i].id;
        double c=q[i].c;
        int fu=getfa(u[id]),fv=getfa(v[id]);
        if(fu==fv)
            continue;
        cnt++;
        ans+=c;
        fa[fu]=fv;
        if(cnt>=n-1)
            break;
    }
    if(ans<=f)
        return true;
    else
        return false;
}
int main()
{

    scanf("%d%d%d",&n,&m,&f);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d%d",&u[i],&v[i],&w[i],&t[i]);
    }
    double l=0,r=1e5,eps=1e-7,mid;
    while(r-l>eps)
    {

        mid=(l+r)/2;//printf("%.4f\n",mid);
        if(check(mid))
            l=mid;
        else
            r=mid;
    }
    if(l!=0)
        printf("%.4lf",r);
    else
        printf("%0.0000");

}
2024/9/20 18:22
加载中...