Pagini recente » Cod sursa (job #1825811) | Cod sursa (job #590654) | Cod sursa (job #56608) | Cod sursa (job #2701055) | Cod sursa (job #2253682)
#include <cstdio>
#include <cstring>
#include <vector>
#define MAXN 1002
using namespace std;
int n, m;
vector<int> arcs[MAXN];
int caps[MAXN][MAXN];
int flow[MAXN][MAXN];
bool viz[MAXN];
int path[MAXN];
int parents[MAXN];
int breadthfirst()
{
int i, j, curr_node, next_node;
path[0] = path[1] = 1;
memset(viz, 0, sizeof(viz));
viz[1] = 1;
for(i=1; i<=path[0]; ++i)
{
curr_node = path[i];
if (curr_node == n)
continue;
for(j=0; j<arcs[curr_node].size(); ++j)
{
next_node = arcs[curr_node][j];
if(caps[curr_node][next_node] == flow[curr_node][next_node] || viz[next_node])
continue;
viz[next_node] = 1;
path [++path[0]] = next_node;
parents[next_node] = curr_node;
}
}
return viz[n];
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int i ,j, x, y, maxflow = 0, curr_node, fmin;
scanf("%d%d", &n, &m);
for(i=0; i<m; ++i)
{
scanf("%d%d%d", &x, &y, &j);
arcs[x].push_back(y);
arcs[y].push_back(x);
caps[x][y] += j;
}
while(breadthfirst())
{
for(i=0; i<arcs[n].size(); ++i)
{
curr_node = arcs[n][i];
if(flow[curr_node][n] == caps[curr_node][n] || viz[curr_node] == 0)
continue;
parents[n] = curr_node;
fmin = -1;
for(j=n; j>1; j=parents[j])
if(fmin == -1 || fmin > caps[parents[j]][j] - flow[parents[j]][j])
fmin = caps[parents[j]][j] - flow[parents[j]][j];
if (fmin)
for(j=n; j>1; j = parents[j])
{
flow[parents[j]][j] += fmin;
flow[j][parents[j]] -= fmin;
}
maxflow = maxflow + fmin;
}
}
printf("%d\n", maxflow);
fclose(stdin);
fclose(stdout);
return 0;
}