Pagini recente » Cod sursa (job #2848010) | Cod sursa (job #1909295) | Cod sursa (job #2943612) | Cod sursa (job #2054357) | Cod sursa (job #1168295)
#include<stdio.h>
#include<vector>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
const int NMAX = 1000, INF = 2e9;
vector <int> graph[NMAX + 5];
queue <int> q;
int n, dad[NMAX + 1], cap[NMAX + 1][NMAX + 1], flow[NMAX + 1][NMAX + 1];
bool vis[NMAX + 1];
int bfs () {
int node;
vector <int> :: iterator it;
memset(vis, 0, sizeof(vis));
memset(dad, 0, sizeof(dad));
while(!q.empty()) q.pop();
q.push(1);
vis[1] = 1;
while(!q.empty()) {
node = q.front();
q.pop();
for(it = graph[node].begin(); it != graph[node].end(); ++ it)
if(cap[node][*it] > flow[node][*it])
if(!vis[*it])
vis[*it] = 1,
q.push(*it),
dad[*it] = node;
if(vis[n])
return 1;
}
return 0;
}
int main() {
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
int i, m, a, b, c, ans, minFlow;
scanf("%d%d", &n, &m);
for(i = 1; i <= m; ++ i) {
scanf("%d%d%d", &a, &b, &c);
graph[a].push_back(b);
graph[b].push_back(a);
cap[a][b] = c;
}
ans = 0;
while(bfs()) {
minFlow = INF;
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;
}