网络流——A - Drainage Ditches HDU - 1532

这里写图片描述
这里写图片描述

网络流板子题,直接套用。
1.cnt–边的数量,从0开始
2.head[]–每一个点最后一条边的编号
3.next–每一条边的下一条边,同一个起点对应。
4.v–每一条边指向的点
5.w–每一条边的残量
6.level[]–标记分层深度

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 205;
const int maxe = 4 * maxn * maxn;
struct MaxFlow {
    struct Edge {
        int v, w, nxt;
    } edge[maxe];
    int head[maxn], tot, level[maxn];
    void init(){
        memset(head,-1,sizeof(head));
        tot=0;
    }
    void add(int u, int v, int w) {
        edge[tot].v = v;
        edge[tot].w = w;
        edge[tot].nxt = head[u];
        head[u] = tot++;

        edge[tot].v = u;
        edge[tot].w = 0;
        edge[tot].nxt = head[v];
        head[v] = tot++;
    }
    bool bfs(int s, int t) {
        memset(level, -1, sizeof(level));
        queue<int>q;
        q.push(s);
        level[s] = 0;
        while(!q.empty()) {
            int u = q.front(); q.pop();
            for(int i = head[u]; ~i; i = edge[i].nxt) {
                if(edge[i].w > 0 && level[edge[i].v] < 0) {
                    level[edge[i].v] = level[u] + 1;
                    q.push(edge[i].v);
                }
            }
        }
        return level[t] > 0;
    }
    int dfs(int u, int t, int f) {
        if(u == t) return f;
        for(int i = head[u]; ~i; i = edge[i].nxt) {
            int v = edge[i].v;
            if(edge[i].w > 0 && level[v] > level[u]) {
                int d = dfs(v, t, min(f, edge[i].w));
                if(d > 0) {
                    edge[i].w -= d;
                    edge[i ^ 1].w += d;
                    return d;
                }
            }
        }
        level[u] = -1;
        return 0;
    }
    int solve(int s, int t) {
        int flow = 0, f;
        while(bfs(s, t)) {
            while(f = dfs(s, t, inf)) flow += f;
        }
        return flow;
    }
}F;

int main(){
    int n,m;
    while(~scanf("%d%d",&m,&n)){
        F.init();
        for(int i=0;i<m;i++){
            int u,v,c;
            scanf("%d%d%d",&u,&v,&c);
            F.add(u,v,c);
        }
        printf("%d\n",F.solve(1,n));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40240576/article/details/82255177