Pagini recente » Cod sursa (job #2938983) | Cod sursa (job #1284487) | Cod sursa (job #1929636) | Cod sursa (job #3250932) | Cod sursa (job #2489031)
#include <fstream>
#include <algorithm>
#include <vector>
#include <deque>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,m, f[1010],t[1010],c[1010][1010],flux[1010][1010];
int tata, minim=-1, sol=0, x, y,capicitate;
deque <int>qq;
vector <int> a[1010];
int bfs(){
int checked=0;
for(int i=1; i<=1000; i++){
f[i]=0;
}
f[1]=1;
qq.push_back(1);
while(!qq.empty()){
int curent=qq.front();
qq.pop_front();
for(int i=0;i<a[curent].size();i++){
int vecin=a[curent][i];
if(f[vecin]==0 && c[curent][vecin]>flux[curent][vecin]){
t[vecin]=curent;
f[vecin]=1;
qq.push_back(vecin);
if(vecin==n){
checked=1;
}
}
}
qq.pop_front();
}
return checked;
}
int main(){
fin>>n>>m;
for(int i=1; i<=m; i++){
fin>>x>>y>>capicitate;
a[x].push_back(y);
a[y].push_back(x);
c[x][y]=capicitate;
}
while(bfs()){
for(int i=0; i<a[n].size(); i++){
int nod=a[n][i];
if(c[nod][n]>flux[nod][n] && f[nod]==1){
minim=c[nod][n]-flux[nod][n];
tata=nod;
while(t[tata]){
minim=min(minim, c[t[tata]][tata]-flux[t[tata]][tata]);
tata=t[tata];
}
sol+=minim;
flux[nod][n]+=minim;
flux[n][nod]-=minim;
tata=nod;
while(t[tata]){
flux[t[tata]][tata]+=minim;
flux[tata][t[tata]]-=minim;
tata=t[tata];
}
}
}
}
fout<<sol;
}