Pagini recente » Cod sursa (job #1414360) | Cod sursa (job #1952609) | Cod sursa (job #2879248) | Cod sursa (job #2256841) | Cod sursa (job #1887478)
#include <cstdio>
#include <string.h>
#include <vector>
#include <queue>
const int MAX_N = 1000;
std::vector<int> vecini[1 + MAX_N];
int c[1 + MAX_N][1 + MAX_N];
int deUnde[1 + MAX_N];
std::queue<int> Q;
std :: vector<int> inD;
bool bfs(int S, int D) {
memset(deUnde, 0, sizeof(deUnde));
Q.push(S);
deUnde[S] = S;
while(!Q.empty()) {
int node = Q.front();
Q.pop();
std :: vector < int > :: iterator son;
for (son = vecini[node].begin(); son != vecini[node].end(); son ++) {
if(c[node][*son] == 0 || deUnde[*son]) continue;
if (*son != D)
Q.push(*son);
deUnde[*son] = node;
}
}
return deUnde[D] != 0;
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int N, M;
scanf("%d%d", &N, &M);
for (int i = 0; i < M; i++)
{
int u, v, capacitate;
scanf("%d%d%d", &u, &v, &capacitate);
vecini[u].push_back(v);
vecini[v].push_back(u);
c[u][v] = capacitate;
}
int S = 1;
int D = N;
for(int u = 1; u <= N; u++) {
if (c[u][D] > 0)
inD.push_back(u);
}
int flux = 0;
while(bfs(S, D)) {
std :: vector < int > :: iterator v;
for (v = inD.begin(); v != inD.end(); v ++){
if (deUnde[*v] != 0) {
deUnde[D] = *v;
int fDrum = 0x7fffffff;
int u = D;
while(u != S) {
if (fDrum > c[deUnde[u]][u]) {
fDrum = c[deUnde[u]][u];
}
u = deUnde[u];
}
u = D;
while(u != S) {
c[deUnde[u]][u] -= fDrum;
c[u][deUnde[u]] += fDrum;
u = deUnde[u];
}
flux += fDrum;
}
}
}
printf("%d\n", flux);
return 0;
}