zoukankan      html  css  js  c++  java
  • POJ 3621 Sightseeing Cows [最优比率环]

    感觉去年9月的自己好$naive$ http://www.cnblogs.com/candy99/p/5868948.html

    现在不也是嘛


    裸题,具体看学习笔记

    二分答案之后判负环就行了

    $dfs$版超快

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <queue>
    using namespace std;
    typedef long long ll;
    const int N=1005,M=5005;
    const double eps=1e-4;
    inline int read(){
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    int n,m,u,v;
    double f[N];
    struct edge{
        int v,ne;
        double w;
    }e[M<<1];
    int h[N],cnt=0;
    inline void ins(int u,int v,int w){
        cnt++;
        e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
    }
    double d[N];
    int inq[N],num[N];
    int q[N],head,tail;
    inline void lop(int &x){if(x==N) x=1;}
    bool NegativeCircle(double mid){
        head=tail=0;
        for(int i=1;i<=n;i++) d[i]=0,inq[i]=1,q[tail++]=i,num[i]=1;
        while(head!=tail){
            int u=q[head++];lop(head);inq[u]=0;
            for(int i=h[u];i;i=e[i].ne){
                int v=e[i].v;double w=mid*e[i].w-f[u];
                if(d[v]>d[u]+w){
                    d[v]=d[u]+w;
                    if(!inq[v]){
                        inq[v]=1;q[tail++]=v;lop(tail);
                        if(++num[v]>n) return true;
                    }
                }
            }
        }
        return false;
    }
    inline bool check(double mid){return NegativeCircle(mid);}
    void solve(){
        double l=0,r=2000;
        while(r-l>eps){
            double mid=(l+r)/2.0;
            if(check(mid)) l=mid;
            else r=mid;
        }
        printf("%.2f",l);
    }
    int main(){
        freopen("in","r",stdin);
        n=read();m=read();
        for(int i=1;i<=n;i++) f[i]=read();
        for(int i=1;i<=m;i++) u=read(),v=read(),ins(u,v,read());
        solve();
    }
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <queue>
    using namespace std;
    typedef long long ll;
    const int N=1005,M=5005;
    const double eps=1e-4;
    inline int read(){
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    int n,m,u,v;
    double f[N];
    struct edge{
        int v,ne;
        double w;
    }e[M<<1];
    int h[N],cnt=0;
    inline void ins(int u,int v,int w){
        cnt++;
        e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
    }
    double d[N];
    int vis[N],cl;
    bool dfs(int u,double mid){
        vis[u]=cl;
        for(int i=h[u];i;i=e[i].ne){
            int v=e[i].v;double w=mid*e[i].w-f[u];
            if(d[v]>d[u]+w){
                d[v]=d[u]+w;
                if(vis[v]==vis[u]) return true;
                else if(dfs(v,mid)) return true;
            }
        }
        vis[u]=0;
        return false;
    }
    bool NegativeCircle(double mid){
        memset(vis,0,sizeof(vis));
        for(cl=1;cl<=n;cl++) if(dfs(cl,mid)) return true;
        return false;
    }
    inline bool check(double mid){return NegativeCircle(mid);}
    void solve(){
        double l=0,r=2000;
        while(r-l>eps){
            double mid=(l+r)/2.0;
            if(check(mid)) l=mid;
            else r=mid;
        }
        printf("%.2f",l);
    }
    int main(){
        freopen("in","r",stdin);
        n=read();m=read();
        for(int i=1;i<=n;i++) f[i]=read();
        for(int i=1;i<=m;i++) u=read(),v=read(),ins(u,v,read());
        solve();
    }
  • 相关阅读:
    控件的Visible设为false后,ViewState是否visible?
    协议森林02 小喇叭开始广播 (以太网与WiFi协议)
    Python深入02 上下文管理器
    信号与频谱
    飓风“桑迪”路径图的制作
    谁动了我的奶酪?
    协议森林01 邮差与邮局 (网络协议概观)
    协议森林04 地址耗尽危机 (IPv4与IPv6地址)
    协议森林03 IP接力赛 (IP, ARP, RIP和BGP协议)
    Python补充03 Python内置函数清单
  • 原文地址:https://www.cnblogs.com/candy99/p/6431534.html
Copyright © 2011-2022 走看看