网络流模板

Dinic:

#include<bits/stdc++.h>
using namespace std;
const int maxn=210;
const int inf=0xfffffff;
struct Edge{int from,to,cap,flow;};
int n,m,s,t;  //结点数,边数(包括反向弧),源点,汇点
vector<Edge> edges;  //edges[e]与edges[e^1]互为反向弧
vector<int> G[maxn];
bool vis[maxn];  
int d[maxn];  //从起点到i的距离 
int cur[maxn];  //当前弧下标 
    
void addedge(int from,int to,int cap){
    edges.push_back((Edge){from,to,cap,0});
    edges.push_back((Edge){to,from,0,0});
    int k=edges.size();
    G[from].push_back(k-2);
    G[to].push_back(k-1);
}
bool BFS(){
    memset(vis,0,sizeof(vis));
    queue<int> Q;
    Q.push(s);
    d[s]=0; vis[s]=1;
    while (!Q.empty()){
        int x=Q.front(); Q.pop();
        for (int i=0;i<G[x].size();i++){
            Edge & e=edges[G[x][i]];
            if (!vis[e.to] && e.cap>e.flow){
                vis[e.to]=1;
                d[e.to]=d[x]+1;
                Q.push(e.to);
            }
        }
    }
    return vis[t];
}
int DFS(int x,int a){
    if (x==t || a==0) return a;
    int flow=0,f;
    for (int& i=cur[x];i<G[x].size();i++){
        Edge& e=edges[G[x][i]];
        if (d[x]+1==d[e.to] && (f=DFS(e.to,min(a,e.cap-e.flow)))>0){
            e.flow+=f;
            edges[G[x][i]^1].flow-=f;
            flow+=f;
            a-=f;
            if (a==0) break;
        }
    }
    return flow;
}
int max_flow(){
    int flow=0;
    while (BFS()){
        memset(cur,0,sizeof(cur));
        flow+=DFS(s,inf);
    }
    return flow;
}
int main(){
    int x,y,z;
    while (cin >> m >> n){
        edges.clear();
        for (int i=1;i<=n;i++) G[i].clear();
        for (int i=0;i<m;i++){
            cin >> x >> y >> z;
            addedge(x,y,z);
        }
        s=1;t=n;
        int ans=max_flow();
        cout << ans << endl;
    }
    return 0;
}
hdoj1532(dinic)

 

posted @ 2018-09-19 19:23  Changer-qyz  阅读(113)  评论(0编辑  收藏  举报