Pagini recente » Cod sursa (job #1011337) | Cod sursa (job #638939) | Cod sursa (job #882458) | Cod sursa (job #2098134) | Cod sursa (job #1827737)
#include <cstdio>
#include <vector>
#include <cstring>
#define MAXN 1001
#define INF 0x3f3f3f3f
using namespace std;
vector <int> graf[MAXN];
int k, n, m, flow[MAXN][MAXN], cp[MAXN][MAXN], last[MAXN], q[MAXN];
bool vis[MAXN];
inline int minim(int a, int b){
return a < b ? a : b;
}
int bfs()
{
int node, neigh, l, r, i;
memset(vis, 0, sizeof vis);
l = r = 1;
q[1] = 1;
vis[1] = 1;
while( l <= r)
{
node = q[l++];
if(node != n)
{
for(i=0; i<graf[node].size(); ++i)
{
neigh = graf[node][i];
if(flow[node][neigh] < cp[node][neigh] && !vis[neigh])
{
vis[neigh] = 1;
q[++r] = neigh;
last[neigh] = node;
}
}
}
}
return vis[n];
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int i, ans = 0, node, neigh, x, y, z, fmin;
scanf("%d%d", &n, &m);
for(i=1; i<=m; ++i)
{
scanf("%d%d%d", &x, &y, &z);
graf[x].push_back(y);
graf[y].push_back(x);
cp[x][y] = z;
}
while(bfs())
{
for(i=0; i<graf[n].size(); ++i)
{
if(vis[graf[n][i]] && flow[graf[n][i]][n] < cp[graf[n][i]][n])
{
node = graf[n][i];
last[n] = node;
fmin = INF;
for(node=n; node!=1; node=last[node])
{
neigh = last[node];
fmin = minim(fmin, cp[neigh][node] - flow[neigh][node]);
}
if(fmin != 0)
{
for(node=n; node!=1; node=last[node])
{
neigh = last[node];
flow[neigh][node] += fmin;
flow[node][neigh] -= fmin;
}
ans += fmin;
}
}
}
}
printf("%d", ans);
return 0;
}