【模板】网络最大流
2017-04-08 19:02
218 查看
——果断附isap代码
#include <cstdio> #include <cstring> #include <queue> using namespace std; int n, m, cnt, ans; int head[10001], to[200001], val[200001], next[200001], dis[10001], cur[10001]; void add(int x, int y, int z) { to[cnt] = y; val[cnt] += z; next[cnt] = head[x]; head[x] = cnt++; } int dfs(int u, int t, int maxflow) { if(u == t) return maxflow; int i, ret = 0, d, v; for(i = cur[u]; i != -1; i = next[i]) { v = to[i]; if(val[i] && dis[v] == dis[u] + 1) { d = dfs(v, t, min(val[i], maxflow - ret)); ret += d; val[i] -= d; val[i ^ 1] += d; cur[u] = i; if(ret == maxflow) return ret; } } return ret; } bool bfs(int s, int t) { queue <int> q; memset(dis, -1, sizeof(dis)); q.push(s); dis[s] = 0; int i, u, v; while(!q.empty()) { u = q.front(); q.pop(); for(i = head[u]; i != -1; i = next[i]) { v = to[i]; if(val[i] && dis[v] == -1) { dis[v] = dis[u] + 1; if(v == t) return 1; q.push(v); } } } return 0; } int main() { int i, j, s, t, x, y, z; scanf("%d %d %d %d", &n, &m, &s, &t); memset(head, -1, sizeof(head)); for(i = 1; i <= m; i++) { scanf("%d %d %d", &x, &y, &z); add(x, y, z); add(y, x, 0); } //dinic while(bfs(s, t)) { for(i = 1; i <= n; i++) cur[i] = head[i]; ans += dfs(s, t, 1e9); } printf("%d", ans); return 0; }Dinic
相关文章推荐
- 最大网络流spa模板 优化的额
- 网络最大流增广路模板(EK & Dinic)
- 【模板】网络最大流
- P3376 【模板】网络最大流
- P3376 【模板】网络最大流
- 网络最大流(dinic)【模板】
- P3376 【模板】网络最大流(70)
- 洛谷 P3376【模板】网络最大流
- 网络最大流-ISAP算法详解与模板
- 洛谷P3376【模板】网络最大流
- 最大网络流 模板
- 算法模板——sap网络最大流 3(递归+邻接表)
- 算法模板——sap网络最大流 3(递归+邻接矩阵)
- P3376 【模板】网络最大流
- 算法模板——Dinic网络最大流 2
- POJ 1459 Power Network(网络最大流,dinic算法模板题)
- 算法模板——sap网络最大流 2(非递归+邻接表)
- 网络最大流(dinic)模板
- Dinic算法 P3376 【模板】网络最大流
- 洛谷 P3376 【模板】网络最大流