AmazingCounters.com

UVA11090 Going in Cycle!! 【SPFA】

题意:求一个无向图的边权平均值最小的环

思路:假设环中Σwi/t<ans 那变形一下就是Σwi<ans*t → Σ(wi-ans)< 0 这样就可以二分答案做了

 

#include <stdio.h>

#include <iostream>

#include<queue>

#include <string.h>

#include <algorithm>

#define maxn 90000

#define esp 0.00000001

using namespace std;

int head[maxn],point[maxn],next[maxn],value[maxn];

int now,n,m,x,y,v,inque[maxn];

double dist[maxn];

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

{

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

    head[x]=now;

    point[now]=y;

    value[now]=v;

}

int spfa(int s,double x)

{

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

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

    int visit[maxn]={0};

    queue<int>q;

    q.push(s);

    visit[s]=1;

    dist[s]=0;

    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];

            if(double(dist[u]+1.0*value[i]-x)<dist[k])

            {

                dist[k]=(double)dist[u]+1.0*value[i]-x;

                if(visit[k]==0)

                {

                    visit[k]=1;

                    inque[k]++;

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

                    q.push(k);

                }

            }

        }

    }

    return 0;

}

int main()

{

    int t,cas=1,flag=0;

    scanf("%d",&t);

    while(t--)

    {

        now=0;

        memset(head,0,sizeof(head));

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

        double l=0,r=0;

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

        {

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

            add(x,y,v);

            if(v>r)r=v;

        }

        printf("Case #%d: ",cas++);

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

        {

            add(n+1,i,0);

        }

        if(spfa(n+1,r+100)==0){printf("No cycle found.\n");continue;}

        while(r-l>esp)

        {

            double mid=(l+r)/2;

            if(spfa(n+1,mid)==1){r=mid;flag=1;}else l=mid;

        }

    //    cout<<spfa(n+1,2.5)<<endl;

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

    }

    return 0;

}

posted @ 2014-10-30 18:20  philippica  阅读(168)  评论(0编辑  收藏  举报