Pagini recente » Cod sursa (job #1815063) | Cod sursa (job #1750355) | Istoria paginii utilizator/andreiberbecaru | Cod sursa (job #495324) | Cod sursa (job #999746)
Cod sursa(job #999746)
#include <cstdio>
#include <bitset>
#include <vector>
#include <algorithm>
#define pb push_back
#define pii pair <int, int>
#define NMAX 1005
#define INF 1000000000
using namespace std;
int n, m, F[NMAX][NMAX], C[NMAX][NMAX], dad[NMAX], Q[NMAX], flow, D[NMAX], best[NMAX];
int source, dest;
vector <int> G[NMAX];
bitset <NMAX> vis;
int BF()
{
int i, j, node, x;
vis.reset();
Q[Q[0] = 1] = source; D[source] = 0;
for (i = 1; i <= Q[0]; i++)
{
node = Q[i];
if (node == dest)
continue ;
for (j = 0; j < (int)G[node].size(); j++)
{
x = G[node][j];
if (!vis[x] && F[node][x] < C[node][x])
{
Q[++Q[0]] = x; vis[x] = 1;
D[x] = D[node] + 1;
}
}
}
if (!vis[dest])
return 0;
vis.reset();
Q[Q[0] = 1] = source; vis[source] = 1; best[source] = INF;
for (i = 1; i <= Q[0]; i++)
{
node = Q[i];
if (node == dest)
continue ;
for (j = 0; j < (int)G[node].size(); j++)
{
x = G[node][j];
if (D[x] == D[node] + 1 && best[x] < min(best[node], C[node][x] - F[node][x]))
{
best[x] = min(best[node], C[node][x] - F[node][x]); dad[x] = node;
if (!vis[x])
Q[++Q[0]] = x, vis[x] = 1;
}
}
}
return vis[dest];
}
void max_flow()
{
int i, node, child, fmin;
while (BF())
{
for (i = 0; i < (int)G[dest].size(); i++)
{
child = G[dest][i];
if (vis[child] && F[child][dest] < C[child][dest])
{
fmin = INF; dad[dest] = child;
for (node = dest; node != source; node = dad[node])
fmin = min(fmin, C[dad[node]][node] - F[dad[node]][node]);
for (node = dest; node != source; node = dad[node])
{
F[dad[node]][node] += fmin;
F[node][dad[node]] -= fmin;
}
flow += fmin;
}
}
}
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d%d", &n, &m);
int i, x, y, z;
for (i = 1; i <= m; i++)
{
scanf("%d%d%d", &x, &y, &z);
G[x].pb(y); C[x][y] = z;
G[y].pb(x);
}
source = 1; dest = n;
max_flow();
printf("%d\n", flow);
return 0;
}