POJ3621 Sightseeing Cows

来源:互联网 发布:tumblr类似软件 编辑:程序博客网 时间:2024/05/17 04:22

又被G++坑了一次。。。。。算了不提也罢。

题意要找一个环游路线使得 收益/花费 最大,显然是基环,于是分数规划,判断是否有正权圈。

然后

弃疗

发现好像不会求正权圈唉。

算了,取反。

改求负权圈,spfa一下就好了。

#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<cmath>using namespace std;const int N=1000+5;const double eps=1e-6;struct Edge{int to,next;double w,c;}e[N*10];int head[N],cnt;void ins(int u,int v,double w){e[++cnt]=(Edge){v,head[u],w,0};head[u]=cnt;}int in[N];bool inq[N];int n,m;double d[N];bool spfa(){queue<int>q;for(int i=1;i<=n;i++){d[i]=0;in[i]=0;inq[i]=1;q.push(i);}while(!q.empty()){int u=q.front();q.pop();inq[u]=false;for(int i=head[u];i;i=e[i].next){int v=e[i].to;if(d[v]>d[u]+e[i].c){d[v]=d[u]+e[i].c;if(!inq[v]){if(++in[v]==n)return true;inq[v]=true;q.push(v);}}}}return false;}int dcmp(double x){if(fabs(x)<eps)return 0;return x<0?-1:1;}double f[N];void build(double x){for(int i=1;i<=cnt;i++)e[i].c=-(f[e[i].to]-x*e[i].w);}int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%lf",&f[i]);int u,v;double w;for(int i=1;i<=m;i++){scanf("%d%d%lf",&u,&v,&w);ins(u,v,w);}double l=0,r=20000;while(r-l>eps){double mid=(l+r)/2;build(mid);if(spfa())l=mid;else r=mid;}if(!dcmp(l))putchar('0');else printf("%.2f",l);return 0;}


0 0
原创粉丝点击