AmazingCounters.com

POJ3621 Sightseeing Cows【最短路】

题目大意:在一个无向图里找一个环,是的点权和除以边权和最大

思路:UVA11090姊妹题 事实上当这题点权和都为1时就是上一题TUT

#include <stdio.h>

#include <iostream>

#include<queue>

#include <string.h>

#include <algorithm>

#define maxn 10009

#define maxm 10001

#define esp 0.001

using namespace std;

int head[1009],next[maxn],now=0,value1[maxn];

int point[maxn],inque[1009],n,m,f[1009];

double dist[1009];

void add(int x,int y,int u,int v)

{

    next[++now]=head[x];

    head[x]=now;

    point[now]=y;

    value1[now]=u;

}

int spfa(int s,double ans)

{

    memset(inque,0,sizeof(inque));

    for(int i=1;i<=n+1;i++)dist[i]=0x3f3f3f3f;

    dist[s]=0;

    int visit[maxn]={0};

    visit[s]=1;

    queue<int>q;

    q.push(s);

    while(!q.empty())

    {

        int u=q.front();

        q.pop();

        visit[u]=0;

        for(int i=head[u];i;i=next[i])

        {

            int k=point[i];

            double vv=ans*value1[i]-f[k];;

            if(dist[u]+vv<dist[k])

            {

                dist[k]=dist[u]+vv;

                if(visit[k]==0)

                {

                    visit[k]=1;

                    inque[k]++;

                    if(inque[k]>=n)return 1;

                    q.push(k);

                }

            }

        }

    }

    return 0;

}

int main()

{

    double l=0,r=2000;

    int x,y,v;

    scanf("%d%d",&n,&m);

    for(int i=1;i<=n;i++)

    {

    //    add(n+1,i,0,0);

        scanf("%d",&f[i]);

    }

    for(int i=1;i<=m;i++)

    {

        scanf("%d%d%d",&x,&y,&v);

        add(x,y,v,f[y]);

      //  add(y,x,v,f[x]);

      //  r+=v;

    }

    while(r-l>esp)

    {

        double mid=(l+r)/2;

        if(spfa(1,mid)==0)r=mid;else l=mid;

    }

 //   printf("%d\n",spfa(1,6.128));

    printf("%.2f\n",l);

    return 0;

}

posted @ 2014-10-31 10:37  philippica  阅读(137)  评论(0编辑  收藏  举报