您的位置:首页 > 理论基础 > 计算机网络

【模板】网络最大流

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

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: