0-1分数规划 & 最优比率生成树

其实分数规划好像很高级的样子,不过其实二分做法很简单。。。

下面给一道例题

【usaco-Earthquake, 2001 Open】

题意:给定n个点m条边,一开始这些边全都是断的,要修一些边使得n个点全部联通。修完一共可以得到F元,修一条边有成本di和时间ti,要使得 得到的钱数 / 总时间 这个比值最大。

纠正一个地方 不是f+z>=0 而是 F+权值和>=0

这道题的大概做法就是这样 我用的是kruskal求最大生成树

Orzzzzzzzzzzz关大学霸 想具体了解的一定要看看 http://www.cnblogs.com/KonjakJuruo/p/5985328.html#commentform

当然 分数规划还有不少 有一个写的挺多的 虽说我不是很懂不过你们也可以去看看

http://blog.csdn.net/hhaile/article/details/8883652

最后 给出本题代码:

#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define me(a,x) memset(a,x,sizeof a)
#define cp(a,x) memcpy(a,x,sizeof a)
using namespace std;
typedef long long LL;
const int N=410,inf=1e9;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
struct node{int x,y;double c;}a[25*N],b[25*N]; //int len,first[N];
/*void ins(int x,int y,int c)
{
	a[++len].y=y,a[len].x=x,a[len].c=c,a[len].next=first[x],first[x]=len;
}*/
int Cmp(node x1,node x2){return x1.c>x2.c;}
int n,m,x[25*N],y[25*N],fa[N];
int fi(int x){return x==fa[x]?x:fa[x]=fi(fa[x]);}
double get()
{
	for(int i=1;i<=n;i++)fa[i]=i;
	sort(a+1,a+1+m,Cmp);
	double s=0;int cnt=0;
	for(int i=1;i<=m;i++)
	{
		int xx=fi(a[i].x),yy=fi(a[i].y);
		if(xx!=yy)
		{
			fa[xx]=yy; cnt++; s+=a[i].c;
		}
		if(cnt==n-1)break;
	}
	return s;
}
int main()
{
	int i,c,p;
	n=read(),m=read(),p=read();
	for(i=1;i<=m;i++)
		b[i].x=read(),b[i].y=read(),x[i]=read(),y[i]=read();
	double l=0,r=(double)p,ans=0;
	while(r-l>=0.0000001)
	{
		double mid=(l+r)/2;
		for(i=1;i<=m;i++)
		{
			a[i]=b[i];
			a[i].c=double(-x[i])-double(y[i])*mid;
		}
		if(p+get()>=0)ans=mid,l=mid+0.0000001;
		else r=mid-0.0000001;
	}
	printf("%.4lf\n",ans);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值