Going in Cycle!! uva

/* 求平均权值最小的回路。

这里有有个转化。W1+W2+...+Wk

二分回路的平均权值mid,将上式转化为(W1-mid)+(W2-mid)+.......+(Wk-mid)<0;

即用spfa来判断是否存在负权回路,注意是负权的回路。

不存在的情况为当mid=max(Wi)+1时依然不存在负权回路,则无解。

因为此时mid为可能取到的最大值,此时都不能有负权回路的话,当mid取更小的值时也不会有。*/

#include 
#include 
#include 
#include 
using namespace std;
const int maxm=3001;
const int maxn=51;
struct edge
{
    int next,to;
    double w;
} e[maxm];
int t;
bool vis[maxn];
int head[maxn],num[maxn];
double d[maxn];
void add(int i,int j,double w)
{
    e[t].to=j;
    e[t].w=w;
    e[t].next=head[i];
    head[i]=t++;
}
int n,m;
bool spfa()
{
    queue  q;
    memset(num,0,sizeof(num));
    memset(vis,false,sizeof(vis));
    memset(d,0x7f,sizeof(d));
    for(int i=1; i<=n; i++) vis[i]=true,d[i]=0,q.push(i);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=false;
        for(int i=head[u]; i!=-1; i=e[i].next)
        {
            int v=e[i].to;
            if(d[u]+e[i].wn) return true;
                }
            }
        }
    }
    return false;
}
bool work(double x)
{
    for(int i=0; i1e-3)
        {
            mid=(l+r)/2;
            if(work(mid)) r=mid;
            else l=mid;
        }
        printf("%.2lf\n",l);
    }
    return 0;
}


你可能感兴趣的:(LRJ白书,spfa&bellman,ACM,图论)