• poj 3621 Sightseeing Cows 夜


    http://poj.org/problem?id=3621

    分数规划+二分   最优比率环   

    不是很难 本题中没有说明从哪个点开始 不过好像默认为1就可以过  poj数据又水了 

    里面的用spfa判定部分还是不太懂 

    代码及其注释:

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    #include<math.h>
    #include<queue>
    #include<string.h>
    
    using namespace std;
    
    const double eps=1e-5;
    const int N=1001;
    const int M=5005;
    int head[N];//邻接表头
    struct node
    {
        int j,k;
        int next;
    }side[M];边
    int value[N];//点的价值
    bool in[N];//是否在队列中
    int innum[N];//如队列次数
    double dist[N];//记录
    queue<int>str;
    void build(int x,int t)//建树
    {
        side[t].next=head[x];
        head[x]=t;
    }
    bool spfa(double L,int n)//看是否有正环  如果有返回true
    {
        while(!str.empty())
        str.pop();
        for(int i=1;i<=n;++i)
        {
            dist[i]=0.0;
            str.push(i);
        }
        memset(in,true,sizeof(in));
        memset(innum,0,sizeof(innum));
        while(!str.empty())
        {
            int x=str.front();
            str.pop();
            in[x]=false;
            int t=head[x];
            while(t!=-1)
            {//cout<<t<<endl;
                int j=side[t].j;
                if(dist[j]<dist[x]+value[j]-L*side[t].k)
                {
                    dist[j]=dist[x]+value[j]-L*side[t].k;
                    if(!in[j])
                    {
                        str.push(j);
                        in[j]=true;
                        ++innum[j];
                        if(innum[j]>=n)//有环
                        return true;
                    }
                }
                t=side[t].next;
            }
        }
        return false;
    }
    int main()
    {
       // freopen("data.txt","r",stdin);
        int n,m;
        while(scanf("%d %d",&n,&m)!=EOF)
        {
            memset(head,-1,sizeof(head));
            for(int i=1;i<=n;++i)
            scanf("%d",&value[i]);
            for(int i=1;i<=m;++i)
            {
                int x;
                scanf("%d %d %d",&x,&side[i].j,&side[i].k);
                build(x,i);
            }
            double l=1.0,r=200.0;
            while(r-l>eps)//用二分 不断向答案逼近
            {
                double mid=(l+r)/2.0;
                if(spfa(mid,n))
                l=mid;
                else
                r=mid;
            }
            printf("%.2f\n",l);
        }
        return 0;
    }
    

      

  • 相关阅读:
    asp.net介绍
    asp.net基本控件
    SQL 查询横表变竖表
    北京北京
    【算法】蓝桥杯dfs深度优先搜索之排列组合总结
    【算法】蓝桥杯dfs深度优先搜索之凑算式总结
    《剑指Offer》面试题3:二维数组中的查找
    《剑指Offer》面试题2:实现Singleton(单例)模式
    《剑指Offer》面试题1:赋值运算符函数
    CentOS6.5x64搭建Hadoop环境
  • 原文地址:https://www.cnblogs.com/liulangye/p/2624764.html
Copyright © 2020-2023  润新知