zoukankan      html  css  js  c++  java
  • POJ1273 最大流 EK算法

    套了个EK的模板

    //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
    #include <stdio.h>
    #include <iostream>
    #include <climits>
    #include <cstring>
    #include <cmath>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <algorithm>
    #define ll long long
    using namespace std;
    
    const int INF = 0x3f3f3f3f;
    const int MAXN = 220;
    
    queue <int> que;
    
    int n, m, max_flow;                                 //max_flow是最大流
    int map[MAXN][MAXN], flow[MAXN][MAXN];              // map[i][j]是每条边的容量,flow[i][j]是每条边的流量
    int res[MAXN], pre[MAXN];                           //res[]是每个点的剩余流量,pre[]是每个点的父亲
    
    void init(){
        memset(map,0,sizeof(map));
        memset(pre,0,sizeof(pre));
    }
    
    bool bfs(int src, int des){
        int index;
        memset(pre, -1, sizeof(pre));
        while(!que.empty()) que.pop();                      //残余流量得变0,一开始所有点都没流入对吧
        pre[src] = 0;                                       //源点嘛,父亲为0
        que.push(src);                                      //从源点开始进行BFS找增广路
        while(!que.empty()){
            index = que.front();
            que.pop();
            for(int i = 1; i <= n; ++i){                    //遍历所有点,找可行边
                if(pre[i] == -1 && map[index][i] > 0){      //该点剩余流量为0 且 容量大于流量,也就是找到了新的结点
                    pre[i] = index;                         //找到新结点,父节点得记录一下吧
                    if(i == des)    return true;
                    que.push(i);
                }
            }
        }
        return false;
    }
    
    int MaxFlow(int src, int des){
        int i, maxflow = 0;
        while(bfs(src, des)){
            int minflow = INF;
            for(i = des; i != src; i = pre[i])
                minflow = min(minflow, map[pre[i]][i]);    //如果u的剩余流量能填满uv就填满,不能的话就把u这点的流量全部流向uv
            for(i = des; i != src; i = pre[i]){            //如果还能增广,那么回溯,从汇点往回更新每条走过的边的流量
                map[pre[i]][i] -= minflow;                 //更新正向流量   (注意这里更新的是流量,而不是容量)
                map[i][pre[i]] += minflow;                 //更新反向流量
            }
            maxflow += minflow;
        }
        return maxflow;
    }
    
    int main(){
        int x, y, val;
        while(EOF != scanf("%d%d",&m,&n)){
            init();
            while(m--){
                scanf("%d%d%d",&x,&y,&val);
                map[x][y] += val;   //有重边
            }
            printf("%d
    ",MaxFlow(1, n));
        }
        return 0;
    }
  • 相关阅读:
    Hadoop伪分布式环境安装
    记一次Xshell配置ssh免密登录时的问题
    HDFS学习笔记二
    HDFS学习笔记一
    十万级百万级数据量的Excel文件导入并写入数据库
    javascript内置对象:Date
    内置对象:Math
    javascript内置对象一:String
    javascript内置对象一: Array数组
    Javascritp 数据结构和二叉树算法
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/3904824.html
Copyright © 2011-2022 走看看