Pagini recente » Cod sursa (job #789006) | Cod sursa (job #960979) | Cod sursa (job #2145966) | Cod sursa (job #1753969) | Cod sursa (job #1657433)
#include <cstdio>
#include <queue>
#include <bitset>
#include <vector>
using namespace std;
const int inf = 0x3f3f3f3f;
const int nmx = 1002;
int n,m,capacitate[nmx][nmx],flux[nmx][nmx],tata[nmx],total;
vector <int> g[nmx];
bitset <nmx> viz;
queue <int> q;
void citire(){
scanf("%d %d", &n, &m);
int nod1,nod2,cost;
for(int i = 1; i <= m; ++i){
scanf("%d %d %d", &nod1, &nod2, &cost);
capacitate[nod1][nod2] = cost;
g[nod1].push_back(nod2);
g[nod2].push_back(nod1);
}
}
bool bfs(){
viz.reset();
viz[1] = true;
q.push(1);
while(not q.empty()){
int nod = q.front();
q.pop();
if(nod == n)
continue;
for(vector<int>::iterator it = g[nod].begin(); it != g[nod].end(); ++it){
if(viz[*it] || capacitate[nod][*it] == flux[nod][*it])
continue;
viz[*it] = true;
tata[*it] = nod;
q.push(*it);
}
}
return viz[n];
}
int main(){
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
citire();
while(bfs())
for(vector<int>::iterator it = g[n].begin(); it != g[n].end(); ++it){
if(capacitate[*it][n] == flux[*it][n] || not viz[*it])
continue;
tata[n] = *it;
int minim = inf, nod = n;
while(nod != 1){
minim = min(minim,capacitate[tata[nod]][nod] - flux[tata[nod]][nod]);
nod = tata[nod];
}
nod = n;
while(nod != 1){
flux[tata[nod]][nod] += minim;
flux[nod][tata[nod]] -= minim;
nod = tata[nod];
}
total += minim;
}
printf("%d\n", total);
return 0;
}