zoukankan      html  css  js  c++  java
  • poj1273 Drainage Ditches (最大流模板)

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

    Dinic算法

    这是一道最大流的经典题

    最大流尽量应该用边表,优于邻接矩阵(所以我写了邻接矩阵版的之后又写了个边表)

    用了新学的Dinic算法

    在每次找增广路之前先跑一遍bfs,把所有点的深度标记,按bfs记下的顺序找增广路,这条增广路上最小的边容量就是这条增广路的最大费用

    跑出一条增广路之后,就开始更新现在的边剩余的容量,并建立反向边。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    int n,m,map[300][300],ans,pre[300];
    void Flow(int s,int t){
        while(1){
            queue<int>q;
            q.push(1);
            memset(pre,0,sizeof(pre));
            while(!q.empty()){
                int point=q.front();
                q.pop();if(point==t)break;
                for(int i=1;i<=n;i++){
                    if(map[point][i]&&!pre[i])pre[i]=point,q.push(i);
                }
            }if(pre[t]==0)break;
            int so=0x7fffffff;
            for(int i=t;i!=s;i=pre[i]){
                so=min(so,map[pre[i]][i]);
            }ans+=so;
            for(int i=t;i!=s;i=pre[i]){
                map[i][pre[i]]+=so;
                map[pre[i]][i]-=so;
            }
        }
    }
    int main(){
        while(scanf("%d%d",&m,&n)!=EOF){
            int f,t,v;
            memset(map,0,sizeof(map));
            for(int i=1;i<=m;i++){
                scanf("%d%d%d",&f,&t,&v);
                map[f][t]+=v;
            }
            ans=0;
            Flow(1,n);
            printf("%d
    ",ans);
        }
    } 
  • 相关阅读:
    xagrs 指定参数位置
    Virtual Machine Kernel Panic : Not Syncing : VFS : Unable To Mount Root FS On Unknown-Block (0,0)
    Laravel Session() 失效的问题
    dirname
    github、git、idea
    ubuntu环境变量在/etc/environment
    ubuntu的PPA
    VMware 增加硬盘ubuntu
    比特币概念
    cpu查询
  • 原文地址:https://www.cnblogs.com/thmyl/p/6502074.html
Copyright © 2011-2022 走看看