Pagini recente » Cod sursa (job #2708670) | Cod sursa (job #3141682) | Cod sursa (job #1876526) | Cod sursa (job #180709) | Cod sursa (job #1404642)
#include<bits/stdc++.h>
#define Nmax 1002
#define IT vector < int > :: iterator
using namespace std;
int N, M, C[Nmax][Nmax], Flow[Nmax][Nmax], Dad[Nmax];
vector < int > G[Nmax];
void Read()
{
freopen("maxflow.in", "r", stdin);
scanf("%d%d", &N, &M);
for( ; M; -- M) {
int X, Y, Z;
scanf("%d %d %d", &X, &Y, &Z);
G[X].push_back(Y);
G[Y].push_back(X);
C[X][Y] += Z;
}
}
int BFS()
{
fill(Dad + 1, Dad + 1 + N, 0);
queue < int > Q;
Q.push(1);
Dad[1] = -1;
while(!Q.empty()) {
int NOD = Q.front();
Q.pop();
if(NOD == N)
continue;
for(IT it = G[NOD].begin(); it != G[NOD].end(); ++ it)
if(!Dad[*it] && C[NOD][*it] != Flow[NOD][*it]) {
Dad[*it] = NOD;
Q.push(*it);
}
}
return Dad[N];
}
int main()
{
Read();
int Max_FLOW = 0, Min_FLOW;
for( ; BFS();)
for(IT it = G[N].begin(); it != G[N].end(); ++ it) {
Min_FLOW = (1 << 30);
if(!Dad[*it] || C[*it][N] == Flow[*it][N])
continue;
for(int i = *it; i != 1; i = Dad[i])
Min_FLOW = min(Min_FLOW , C[Dad[i]][i] - Flow[Dad[i]][i]);
if(Min_FLOW) {
for(int i = *it; i != 1; i = Dad[i]) {
Flow[Dad[i]][i] += Min_FLOW;
Flow[i][Dad[i]] -= Min_FLOW;
}
Max_FLOW += Min_FLOW;
}
}
fprintf(fopen("maxflow.out", "w"), "%d", Max_FLOW);
return 0;
}