分数规划24pts悬关
查看原帖
分数规划24pts悬关
351679
shaun2000楼主2024/9/20 16:36

record

#include<bits/stdc++.h>

using namespace std;

int fa[405];
int getfa(int x)
{
    if(fa[x]==x)
        return x;
    else
    {
        return fa[x]=getfa(fa[x]);
    }
}
priority_queue< pair <double , int > , vector < pair < double,int > > ,greater < pair < double,int > > > q;

int book[405];
int u[405],v[405],w[405],t[405],n,m,f;
bool check(double x)
{
    while(!q.empty())
        q.pop();
    for(int i=1;i<=n;i++)
        fa[i]=i;
    for(int i=1;i<=m;i++)
        q.push(make_pair((1.0*w[i]+1.0*x*t[i]),i));
    double ans=0;
    int cnt=0;
    while(!q.empty())
    {
        int id=q.top().second;
        double c=q.top().first;
        q.pop();
        if(getfa(u[id]) == getfa(v[id]))
            continue;
        cnt++;
        ans+=c;
        fa[u[id]]=v[id];
        if(cnt>n)
            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("%.4f",r);
    else
        printf("%0.0000");

}
2024/9/20 16:36
加载中...