Pagini recente » Cod sursa (job #1909011) | Cod sursa (job #537231) | Cod sursa (job #833816) | Cod sursa (job #884800) | Cod sursa (job #2695511)
#include <bits/stdc++.h>
#define oo (1 << 30)
#define MAX 1005
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int n, m, x ,y , COST, FLOW;
int cap[MAX][MAX], flux[MAX][MAX], vizitat[MAX], t[MAX];
vector < int > g[MAX];
deque < int > d;
int BFS(){
int NOD;
memset(vizitat, 0, sizeof(vizitat));
vizitat[1] = 1;
d.push_back(1);
while(!d.empty()){
NOD = d.back();
d.pop_back();
if(NOD == n)
continue;
for(int i = 0; i < g[NOD].size(); i++){
int vec = g[NOD][i];
if(vizitat[vec] || cap[NOD][vec] == flux[NOD][vec])
continue;
vizitat[vec] = 1;
t[vec] = NOD;
d.push_front(vec);
}
}
return vizitat[n];
}
int main(){
in>>n>>m;
while(m--){
in>>x>>y>>COST;
cap[x][y] += COST;
g[x].push_back(y);
g[y].push_back(x);
}
for(FLOW = 0; BFS();)
for(int i = 0; i < g[n].size(); i++){
int NOD = g[n][i];
if(flux[NOD][n] == cap[NOD][n] || !vizitat[NOD])
continue;
t[n] = NOD;
int fluxmin = oo;
for(NOD = n; NOD != 1; NOD = t[NOD])
fluxmin = min(fluxmin, cap[t[NOD]][NOD] - flux[t[NOD]][NOD]);
if(!fluxmin)
continue;
for(NOD = n; NOD != 1; NOD = t[NOD]){
flux[t[NOD]][NOD] += fluxmin;
flux[NOD][t[NOD]] -= fluxmin;
}
FLOW += fluxmin;
}
out<<FLOW;
}