• 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. ");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 ",r);

        }

        return 0;

    }

  • 相关阅读:
    PHP学习(6)——代码重用与函数编写的一些注意事项
    PHP学习(5)——字符串操作与POSIX正则
    PHP学习(4)——数组的使用
    Three.js基础探寻十——动画
    PHP学习(3)——数据的存储与检索
    Three.js基础探寻九——网格
    PHP学习(2)——操作符与迭代整理
    个人寒假作业项目《印象笔记》第一天
    《需求工程》阅读笔记2
    《需求工程》阅读笔记
  • 原文地址:https://www.cnblogs.com/philippica/p/4063374.html
Copyright © 2020-2023  润新知