zoukankan      html  css  js  c++  java
  • P1343 地震逃生

    模板网络流最大流

    题目链接:https://www.luogu.com.cn/problem/P1343

    源点为1,终点为n

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=200000+5;
    int last[maxn],nxt[maxn*2],to[maxn*2],wi[maxn*2],cnt=-1;
    int deep[maxn];
    int s,t,n,m,x;
    void add(int u,int v,int w)
    {
        to[++cnt]=v;
        wi[cnt]=w;
        nxt[cnt]=last[u];
        last[u]=cnt;
        return ;
    }
    bool bfs()
    {
        queue < int > Q;
        memset(deep,0,sizeof(deep));
        while(!Q.empty())
            Q.pop();//预处理,清空队列,deep 
        Q.push(s);
        deep[s]=1;//加入源头 
        do{
            int u=Q.front(); Q.pop();
            for(int i=last[u];i!=-1;i=nxt[i])
                if(wi[i]>0 && deep[to[i]]==0)//边有残量 点未被占领 
                {
                    deep[to[i]]=deep[u]+1;
                    Q.push(to[i]);
                }
        }while(!Q.empty());
        if(deep[t]==0) return 0;//未经过t点 返回false 
        return 1;
    }
    int dfs(int u,int dist)
    {
        if(u==t) return dist;//到达终点 
        for(int i=last[u];i!=-1;i=nxt[i])
            if(deep[to[i]]==deep[u]+1 && wi[i]!=0)//分层正确 与 有剩余残量 
            {
                int di=dfs(to[i],min(dist,wi[i]));
                if(di>0)
                {
                    wi[i]-=di;//正向边减 
                    wi[i^1]+=di;//反向边加 
                    return di;
                }
            }
        return 0;
    }
    int dinic()
    {
        int ans=0;
        while(bfs())
            while(int d=dfs(s,10000007))
            ans+=d;
        return ans;
    }
    int main()
    {
        memset(last,-1,sizeof(last));
        memset(nxt,-1,sizeof(nxt));
        cin>>n>>m>>x;
        s=1; t=n;
        for(int i=1;i<=m;i++)
        {
            int u,v,w;
            cin>>u>>v>>w;
            add(u,v,w);
            add(v,u,0);
        }
        int d=dinic();
        if(d==0)
        {
            cout<<"Orz Ni Jinan Saint Cow!";
            return 0;
        }
        cout<<d<<" ";
        if(x%d==0) cout<<x/d;
        else cout<<x/d+1;
        return 0;
    }
  • 相关阅读:
    jsfl 常用自定义方法
    jsfl 常用方法
    Java 跨平台原理
    JDK、JRE 和 JVM 的区别
    win10 中安装 JDK8 以及环境配置
    JDK 14 都已经发布了,Java 8 依然是我的最爱
    DOS 命令大全用法详解
    《Java程序设计基础》 第4章手记
    堆和栈的区别
    CC#JavaPython 基本数据类型比较
  • 原文地址:https://www.cnblogs.com/wdxxz3274/p/11965438.html
Copyright © 2011-2022 走看看