求助 36分
查看原帖
求助 36分
307535
Custlo0793楼主2020/12/24 14:14

record

#include<bits/stdc++.h>
using namespace std;
struct eage
{
	int x,y;
	double cost,ka,kb;
}p[1000000];
double f,eps=1e-6;
int dad[200010],n,m;
bool cmp(eage a,eage b)
{
	return a.cost>b.cost;
}
int find(int x)
{
    int a=x;
    while(x!=dad[x])
    x=dad[x];
    while(a!=dad[a])
    {
        int z=a;
        a=dad[a];
        dad[z]=x;
    }
    return x;
}
int check(double x)
{
	for(int i=1;i<=n;i++)
    dad[i]=i;
    for(int i=1;i<=n;i++)
    p[i].cost=-p[i].ka-x*p[i].kb;
    sort(p+1,p+1+m,cmp);
    int check=0;
    double sum=f;
	for(int i=1;i<=m;i++)
	{
		int fav=find(p[i].x),fau=find(p[i].y);
		if(fav!=fau)
		{
			dad[fav]=fau;
			sum+=p[i].cost;
			check++;
			if(check>=n-1)
			{
				break ;
			}
		}
	}
	return sum>=0;
}
int main()
{
    ios::sync_with_stdio(false);
	cin>>n>>m>>f;
    for(int i=1;i<=m;i++)
        scanf("%d%d%lf%lf",&p[i].x,&p[i].y,&p[i].ka,&p[i].kb);
    
    double l=0,r=1e9,mid;
    while(l+eps<r)
    {
        mid=(l+r)/2;
        if(check(mid)) l=mid;
        else r=mid;
    }
	printf("%.4lf",r);
    return 0;
}

要上学了,可能很久以后才能看

2020/12/24 14:14
加载中...