Pagini recente » Cod sursa (job #141629) | Cod sursa (job #418) | Cod sursa (job #2802820) | Cod sursa (job #2936073) | Cod sursa (job #2616453)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
const int MAXN = 1000 + 1;
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int flux[MAXN][MAXN],capacitate[MAXN][MAXN],dist[MAXN];
vector<int>graf[MAXN];
queue<int> coada;
int n,m;
vector<int> bfs(int sursa,int destinatie){
for(int i = 1; i <= n; i++)
dist[i] = n + 5;
coada.push(sursa);
dist[sursa] = 0;
bool e_ok = false;
while(coada.size()){
int nod = coada.front();
if(nod == destinatie){
e_ok = true;
while(coada.size()){
coada.pop();
}
break;
}
coada.pop();
for(auto const &vecin : graf[nod]){
if(dist[nod] + 1 < dist[vecin] && flux[nod][vecin] < capacitate[nod][vecin]){
dist[vecin] = dist[nod] + 1;
coada.push(vecin);
}
}
}
if(!e_ok)
return {};
int distanta = dist[destinatie] - 1;
int nod = destinatie;
vector<int>drum;
drum.push_back(destinatie);
while(distanta >= 0){
for(auto const &vecin : graf[nod]){
if(dist[vecin] == distanta && flux[vecin][nod] < capacitate[vecin][nod]){
drum.push_back(vecin);
nod = vecin;
distanta--;
break;
}
}
}
reverse(drum.begin(),drum.end());
return drum;
}
int main()
{
in>>n>>m;
for(int i = 1; i <= m; i++){
int x,y,cap;
in>>x>>y>>cap;
graf[x].push_back(y);
graf[y].push_back(x);
capacitate[x][y] += cap;
capacitate[y][x] = 0;
}
int ans = 0;
while(true){
vector<int>drum = bfs(1,n);
if(drum.size() == 0)
break;
// cout<<"Drumul este : "<<"\n";
// for(int i = 0; i < drum.size(); i++){
// cout<<drum[i]<<" ";
// }
int minim = 2e9;
for(int i = 0; i + 1 < drum.size(); i++){
int nod1 = drum[i],nod2 = drum[i + 1];
minim = min(minim,capacitate[nod1][nod2] - flux[nod1][nod2]);
}
//cout<<"Minim "<<minim<<endl;
for(int i = 0; i + 1 < drum.size(); i++){
int x = drum[i],y = drum[i + 1];
flux[x][y] += minim;
flux[y][x] -= minim;
}
ans += minim;
}
out<<ans<<"\n";
return 0;
}