建设咨询网站,现在能不能去西安,wordpress ios7,互联网公司排名情况正题
题目链接:https://www.luogu.org/problemnew/show/P1768 题目大意
求一条回路使得路上∑vi∑pi\frac{\sum v_i}{\sum p_i}∑pi∑vi最大。 解题思路
考虑01分数规划 ∑vi∑pians\frac{\sum v_i}{\sum p_i}ans∑pi∑vians ∑vians∗∑pi\sum v_ians*\sum p_i…正题
题目链接:https://www.luogu.org/problemnew/show/P1768 题目大意
求一条回路使得路上∑vi∑pi\frac{\sum v_i}{\sum p_i}∑pi∑vi最大。 解题思路
考虑01分数规划 ∑vi∑pians\frac{\sum v_i}{\sum p_i}ans∑pi∑vians ∑vians∗∑pi\sum v_ians*\sum p_i∑vians∗∑pi 转为二分判定 ∑vi−ans∗∑pigt;0\sum v_i-ans*\sum p_igt;0∑vi−ans∗∑pi0 ans∗∑pi−∑vilt;0ans*\sum p_i-\sum v_ilt;0ans∗∑pi−∑vi0
然后对于每次二分计算边权然后求负环 codecodecode
#includecstdio
#includequeue
#includecstring
using namespace std;
const int N7100,M21000;
struct node{int to,next;double v,p,w;
}a[M*2];
queueint q;
double f[N];
int n,m,tot,ls[N],cnt[N];
double l,r;
bool v[N];
void addl(int x,int y,double v,double p)
{a[tot].toy;a[tot].nextls[x];a[tot].vv;a[tot].pp;ls[x]tot;
}
bool spfa()
{for(int i1;in;i)f[i]2147483647/3;memset(cnt,0,sizeof(cnt));q.push(n);cnt[n]1;f[n]0;v[n]1;while(!q.empty()){int xq.front();v[x]0;q.pop();for(int ils[x];i;ia[i].next){int ya[i].to;if(f[x]a[i].wf[y]){f[y]f[x]a[i].w;cnt[y]cnt[x]1;if(cnt[y]na[i].w0)return true;if(!v[y]){v[y]1;q.push(y);}}} }return false;
}
bool check(double ans){for(int i1;itot;i)a[i].wa[i].p*ans-a[i].v;if(spfa()) return true;else return false;
}
int main()
{scanf(%d%d,n,m);for(int i1;im;i){int x,y;double v,p;scanf(%d%d%lf%lf,x,y,v,p);addl(x,y,v,p);}n;for(int i1;in;i)addl(n,i,0,0);l0;r500;while(r-l1e-2){double mid(lr)/2;if(check(mid)) lmid;else rmid;}if(l0) printf(-1);else printf(%.1lf,l);
}