Pagini recente » Cod sursa (job #2968013) | Cod sursa (job #1828906) | Cod sursa (job #225655) | Cod sursa (job #2232254) | Cod sursa (job #728848)
Cod sursa(job #728848)
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#define nMax 1010
#define infinit 99999999;
using namespace std;
int capacitate[nMax][nMax];
int flux[nMax][nMax];
int n;
vector <int> graf[nMax];
int tati[nMax];
int bsf(){
queue <int> q;
memset (tati, 0, sizeof (tati));
tati[1] = 1;
q.push(1);
while (!q.empty()){
int x = q.front();
q.pop();
for (unsigned int i = 0; i < graf[x].size(); ++ i){
int nod = graf[x][i];
if (tati[nod] == 0 && capacitate[x][nod] != flux[x][nod]){
tati[nod] = x;
if (nod != n){
q.push(nod);
}
}
}
}
return tati[n];
}
void citire(){
int m;
scanf ("%d %d", &n, &m);
while (m --){
int x;
int y;
int c;
scanf ("%d %d %d", &x, &y, &c);
graf[x].push_back(y);
graf[y].push_back(x);
capacitate[x][y] = c;
}
}
void rez(){
int fluxMaxim = 0;
while (bsf()){
for (unsigned int i = 0; i < graf[n].size(); ++ i){
int nod = graf[n][i];
if (tati[nod] && capacitate[nod][n] != flux[nod][n]){
tati[n] = nod;
int fluxCurent = infinit;
for (int j = n; j != 1; j = tati[j]){
if (fluxCurent > capacitate[tati[nod]][nod] - flux[tati[nod]][nod]){
fluxCurent = capacitate[tati[nod]][nod] - flux[tati[nod]][nod];
}
}
if (fluxCurent <= 0){
continue;
}
for (int j = n; j != 1; j = tati[j]){
flux[tati[j]][j] += fluxCurent;
flux[j][tati[j]] -= fluxCurent;
}
fluxMaxim += fluxCurent;
}
}
}
printf ("%d\n", fluxMaxim);
}
int main(){
freopen ("maxflow.in", "r", stdin);
freopen ("maxflow.out", "w", stdout);
citire();
rez();
return 0;
}