Pagini recente » Cod sursa (job #1162756) | Cod sursa (job #2137889) | Cod sursa (job #2137773) | Cod sursa (job #786942) | Cod sursa (job #2592833)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int NMAX = 1000, MMAX = 5000;
const int INF = 1000000000;
struct muchie {
int inc, sf, cf;
muchie(int iinc = 0, int ssf = 0, int ccf = 0) {
inc = iinc, sf = ssf, cf = ccf;
}
};
bool uz[NMAX + 5];
int n, m, flux;
int from[NMAX + 5];
muchie muchii[2 * MMAX + 5];
vector<int> v[NMAX + 5];
queue<int> q;
bool bfs(int start) {
for(int i = 1; i <= n; i++)
uz[i] = false;
q.push(start);
uz[start] = true;
from[start] = -1;
while(!q.empty()) {
int nod = q.front();
q.pop();
if(nod == n)
continue;
for(int mvec: v[nod]) {
muchie &crt = muchii[mvec];
if(!uz[crt.sf] && crt.cf > 0) {
from[crt.sf] = mvec;
uz[crt.sf] = true;
q.push(crt.sf);
}
}
}
return uz[n];
}
void update_flux() {
int minf = INF + 5;
for(int i = n; from[i] != -1; i = muchii[from[i]].inc)
minf = min(minf, muchii[from[i]].cf);
if(!minf)
return;
flux += minf;
for(int i = n; from[i] != -1; i = muchii[from[i]].inc) {
muchii[from[i]].cf -= minf;
muchii[from[i] ^ 1].cf += minf;
}
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int x, y, z;
scanf("%d %d", &n, &m);
for(int i = 0; i < m; i++) {
scanf("%d %d %d", &x, &y, &z);
muchii[2 * i] = muchie(x, y, z);
muchii[2 * i + 1] = muchie(y, x, 0);
v[x].push_back(2 * i);
v[y].push_back(2 * i + 1);
}
while(bfs(1))
for(int mvec: v[n]) {
muchie &crt = muchii[mvec];
if(uz[crt.sf] && muchii[mvec ^ 1].cf > 0) {
from[n] = mvec ^ 1;
update_flux();
}
}
printf("%d", flux);
return 0;
}