Pagini recente » Cod sursa (job #2111557) | Cod sursa (job #2808438) | Cod sursa (job #2595867) | Cod sursa (job #2461179) | Cod sursa (job #1884888)
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
#define MAXN 1001
#define MAXM 5001
#define INF 0x3f3f3f3f
using namespace std;
vector <int> G[MAXN];
int q[MAXN], n, m, capacity[MAXN][MAXN], flow[MAXN][MAXN], dad[MAXN];
bool seen[MAXN];
inline bool bfs()
{
int left = 0, right = 0, i, node, son;
memset(seen, 0, sizeof seen);
q[right++] = 1;
while(left < right)
{
node = q[left++];
if(node == n) continue;
for(i=0; i<G[node].size(); ++i)
{
son = G[node][i];
if(!seen[son] && flow[node][son] < capacity[node][son])
{
dad[son] = node;
seen[son] = 1;
q[right++] = son;
}
}
}
return seen[n];
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int ans = 0, i, x, y, z, node, son, minflow;
scanf("%d%d", &n, &m);
for(i=1; i<=m; ++i)
{
scanf("%d%d%d", &x, &y, &z);
capacity[x][y] = z;
G[x].push_back(y);
G[y].push_back(x);
}
while(bfs())
{
for(i=0; i<G[n].size(); ++i)
{
son = G[n][i];
if(seen[son] && flow[son][n] < capacity[son][n])
{
dad[n] = son;
minflow = INF;
for(node=n; node!=1; node=dad[node])
{
son = dad[node];
minflow = min(minflow, capacity[son][node] - flow[son][node]);
}
if(minflow != 0)
{
for(node=n; node!=1; node=dad[node])
{
son = dad[node];
flow[son][node] += minflow;
flow[node][son] -= minflow;
}
}
ans += minflow;
}
}
}
printf("%d", ans);
return 0;
}