首页 > 其他 > 详细

01 分数规划

时间:2020-07-23 22:15:50      阅读:55      评论:0      收藏:0      [点我收藏+]

P2868 Sightseeing Cows G

给出一个 \(n\) 个点 \(m\) 条的有点权与边权的有向图,求一个环使得环上的点权和除以边权和最大。

最优比率环问题,显然01分数规划

环上第\(i\)个点点权为\(a_i\),第\(i\)条边的边权为\(b_i\)

\[\frac{\sum_{i=1}^nF_i}{\sum_{i=1}^mT_i}=ans\对于01分数规划,考虑二分.二分可以将最优化问题转化为判定问题.如果二分出来mid为L,则问题转化为是否存在\\frac{\sum F_i}{\sum T_i}>L~~~分母乘过去(T_i>0)\\sum(F_i-L*T_i)>0~~左式乘-1~~~\sum(L*T_i-F_i)<0\问题转化为求负环,对于入点为u_i,出点为v_i的边e_i,把边权看做mid*T[e_i]-F[u_i],判负环\有负环则L=mid,否则R=mid \]

#include<cstdio>
#include<queue>
#include<iostream>
#define maxm 5005
#define maxn 1002
using namespace std;
inline int read() {
    int x = 0,f = 1; char s = getchar();
    while(s < ‘0‘ || s > ‘9‘) {if(s == ‘-‘) f = -1;s = getchar();}
    while(s >= ‘0‘ && s <= ‘9‘) {x = x * 10 + s - ‘0‘;s = getchar();}
    return f * x;
}
int l,p,head[maxn],tot = 0,vis[maxn],num[maxn],a[maxn];
double d[maxn];
struct edge{
	int to,next,dis;
}e[maxm];
inline void add(int u,int v,int w){
	e[++tot].to = v;
	e[tot].next = head[u];
	e[tot].dis = w;
	head[u] = tot;
}
int check(double x){//找负环 
	queue<int> q;
	for(int i = 1;i <= l;i++){
		q.push(i);
		d[i] = 0;vis[i] = num[i] = 1;
	}
	while(!q.empty()){
		int u = q.front();
		q.pop();vis[u] = 0;
		for(int i = head[u];i;i = e[i].next){
			int v = e[i].to;
			double dis = (double)e[i].dis;
			if(d[v] > d[u] + x * dis - (double)a[u])//边权为mid*Tim[e_i]-Fun[u_i]
            {
                d[v] = d[u] + x * dis - (double)a[u];
                if(!vis[v])
                {
                    q.push(v); vis[v]=1;
                    if(++num[v] >= l) return 1;
                }
            }
		} 
	}
	return 0;
}
int main(){
 l=read();p=read();
    for(int i=1;i<=l;++i)a[i]=read();
    for(int i=1;i<=p;++i)
    {
        int u=read(),v=read(),dis=read();
        add(u,v,dis);
    }
    double L=0,R=5001,mid;
    while(R-L>1e-4)
    {
        mid=(L+R)/2;
        if(check(mid))L=mid;
        else R=mid;
    }
    printf("%.2lf",L);
    return 0;
}

01 分数规划

原文:https://www.cnblogs.com/shikeyu/p/13368165.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!