#include <iostream> #include <cstdio> #include <cstring> #include <queue> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int maxn = 100100, INF = 0x7fffffff; int d[maxn], head[maxn]; int n, m, s, t; struct edge{ int u, v, f, c, next; }Node[2*maxn]; void add(int u, int v, int c, int f, int i) { Node[i].u = u; Node[i].v = v; Node[i].f = f; Node[i].c = c; Node[i].next = head[u]; head[u] = i; } int bfs() { queue<int> Q; mem(d,0); Q.push(s); d[s] = 1; while(!Q.empty()){ int u = Q.front(); Q.pop(); for(int i=head[u]; i!=-1; i=Node[i].next) { edge e = Node[i]; if(!d[e.v] && e.c > e.f) { d[e.v] = d[e.u] + 1; Q.push(e.v); } } } return d[t] != 0; } int dfs(int u, int cap) { // cout<< u << " " << cap <<endl; if(u == t) return cap; for(int i=head[u]; i!= -1; i=Node[i].next) { edge e = Node[i]; if(d[e.v] == d[e.u] + 1 && e.c > e.f) { int V = dfs(e.v, min(cap, e.c - e.f)); if(V > 0){ Node[i].f += V; Node[i^1].f -= V; return V; } } } return 0; } int Dinic() { int ans = 0; while(bfs()) { while(int l = dfs(s,INF)) ans += l; } return ans; } int main() { mem(head,-1); cin>> n >> m >> s >> t; int cnt = 0; for(int i=0; i<m; i++) { int u, v, w; cin>> u >> v >> w; add(u, v, w, 0, cnt++); add(v, u, 0, 0, cnt++); } cout<< Dinic() <<endl; return 0; }
网络流Dinic模板
猜你喜欢
转载自www.cnblogs.com/WTSRUVF/p/9193509.html
今日推荐
周排行