dinic

贡献者:KingSann 类别:代码 时间:2018-02-02 20:34:02 收藏数:6 评分:0
返回上页 举报此文章
请选择举报理由:




收藏到我的文章 改错字
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
using namespace std;
const int N = 100010;
int n, m, s, t;
queue<int> q;
int dis[N];
int head[N], rest[N], to[N], flow[N], tot;
void add_sub(int u, int v, int f) {
to[tot] = v;
flow[tot] = f;
rest[tot] = head[u];
head[u] = tot ++;
}
void add(int u, int v, int f) {
add_sub(u, v, f);
add_sub(v, u, 0);
}
bool bfs() {
memset(dis, -1, sizeof dis);
q.push(s);
dis[s] = 0;
while(q.size()) {
int u = q.front();
q.pop();
for(int i = head[u] ; ~i ; i = rest[i]) {
int v = to[i];
if(flow[i] && dis[v] == -1) {
dis[v] = dis[u] + 1;
q.push(v);
}
}
}
return dis[t] != -1;
}
int dfs(int u, int fw) {
if(u == t || !fw) return fw;
int use = 0;
for(int i = head[u] ; ~i ; i = rest[i]) {
int v = to[i];
if(flow[i] && dis[v] == dis[u] + 1) {
int a = dfs(v, min(flow[i], fw - use));
flow[i] -= a;
flow[i ^ 1] += a;
use += a;
if(use == fw) break;
}
}
if(!use) dis[u] = -1;
return use;
}
int sol() {
int ret = 0;
while(bfs()) ret += dfs(s, 0x3f3f3f3f);
return ret;
}
int lastid[N], con[N];
int main() {
memset(head, -1, sizeof head);
scanf("%d%d", &n, &m);
s = n + 1, t = s + 1; // s是超级源,t是超级汇
}
声明:以上文章均为用户自行添加,仅供打字交流使用,不代表本站观点,本站不承担任何法律责任,特此声明!如果有侵犯到您的权利,请及时联系我们删除。
文章热度:
文章难度:
文章质量:
说明:系统根据文章的热度、难度、质量自动认证,已认证的文章将参与打字排名!

本文打字排名TOP20

登录后可见

用户更多文章推荐