Pagini recente » Cod sursa (job #3323328) | Borderou de evaluare (job #1545850) | Monitorul de evaluare | Cod sursa (job #616372) | Cod sursa (job #3348937)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
const int mxN = 1e3 + 1, C_MAX = 11e4 + 1;
int cap[mxN][mxN], n, m, rang[mxN], iter[mxN];
vector<int> G[mxN];
void updateMuchie(int a, int b, int v){
cap[a][b] -= v;
cap[b][a] += v;
}
bool bfs(int s){
queue<int> Q;
for(int i = 1; i <= n; i++)
rang[i] = 0;
rang[s] = 1;
Q.push(s);
while(!Q.empty()){
int nod = Q.front();
Q.pop();
for(int x : G[nod]){
if(cap[nod][x] > 0 && !rang[x]){
rang[x] = rang[nod] + 1;
Q.push(x);
}
}
}
return rang[n];
}
int dfs(int nod, int cantitate){
if(nod == n)
return cantitate;
for(int &i = iter[nod]; i < (int)G[nod].size(); i++){
int x = G[nod][i];
if(cap[nod][x] > 0 && rang[x] == rang[nod] + 1){
int drum = dfs(x, min(cap[nod][x], cantitate));
if(drum){
updateMuchie(nod, x, drum);
return drum;
}
}
}
return 0;
}
int main(){
int ans = 0, f;
fin >> n >> m;
for(int i = 1; i <= m; i++){
int a, b, c;
fin >> a >> b >> c;
cap[a][b] = c;
G[a].push_back(b);
G[b].push_back(a);
}
while(bfs(1)){
for(int i = 1; i <= n; i++)
iter[i] = 0;
do{
f = dfs(1, C_MAX);
ans += f;
}while(f);
}
fout << ans;
}