Pagini recente » Cod sursa (job #2765574) | Cod sursa (job #1312988) | Cod sursa (job #2402559) | Cod sursa (job #1081095) | Cod sursa (job #1262703)
#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
using namespace std;
const int NMAX = 1002, INF = 2e9;
vector <int> graph[NMAX];
bool vis[NMAX];
int n, dad[NMAX], cap[NMAX][NMAX], d[NMAX], flow[NMAX][NMAX];
int bfs (int node) {
queue <int> q;
memset(vis, 0, sizeof(vis));
q.push(node);
vis[node] = 1;
while(!q.empty()) {
node = q.front();
q.pop ();
for(vector <int>::iterator it= graph[node].begin(); it != graph[node].end(); ++ it)
if(!vis[*it] && cap[node][*it] > flow[node][*it]) {
dad[*it] = node;
vis[*it] = 1;
q.push(*it);
}
}
return vis[n];
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int m, i, j, x, y, ans, minFlow;
scanf("%d%d", &n, &m);
for(i = 1; i <= m; ++ i) {
scanf("%d%d", &x, &y);
scanf("%d", &cap[x][y]);
graph[x].push_back(y);
}
ans = 0;
while(bfs(1)) {
minFlow = 2e9;
i = n;
while(i != 1) {
minFlow = min(minFlow, cap[dad[i]][i] - flow[dad[i]][i]);
i = dad[i];
}
i = n;
while(i != 1) {
flow[dad[i]][i] += minFlow;
flow[i][dad[i]] -= minFlow;
i = dad[i];
}
ans += minFlow;
}
printf("%d\n", ans);
return 0;
}