Pagini recente » Cod sursa (job #1400562) | Cod sursa (job #2440088) | Cod sursa (job #2459143) | Cod sursa (job #1148847) | Cod sursa (job #2657877)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int NMAX = 1005;
const int INF = (1<<29);
int f[NMAX][NMAX],c[NMAX][NMAX],tata[NMAX];
int n,m,x,y,z,rasp=0;
bool ver[NMAX];
vector <int> v[NMAX];
queue <int> q;
bool bfs(){
for(int i=1;i<=n;i++) ver[i]=false;
ver[1]=true;
q.push(1);
while(!q.empty()){
int node=q.front();
q.pop();
if(node==n) continue;
for(int i=0;i<v[node].size();i++){
int vecin=v[node][i];
if(ver[vecin]==false and c[node][vecin]>f[node][vecin]){
q.push(vecin);
tata[vecin]=node;
ver[vecin]=true;
}
}
}
if(ver[n]==true) return 1;
return 0;
}
int main()
{
fin >> n >> m;
for(int i=1;i<=m;i++){
fin >> x >> y >> z;
v[x].push_back(y);
v[y].push_back(x);
c[x][y]=z;
}
while(bfs()==true){
for(int i=0;i<v[n].size();i++){
int nod=v[n][i];
if(ver[nod]==true and c[nod][n]>f[nod][n]){
int minim=INF;
int aux=n;
while(tata[aux]!=0){
int t=tata[aux];
if(c[t][aux]-f[t][aux]<minim)
minim=c[t][aux]-f[t][aux];
aux=t;
}
if(minim==0) continue;
rasp+=minim;
aux=n;
while(tata[aux]!=0){
int t=tata[aux];
f[t][aux]+=minim;
f[aux][t]-=minim;
aux=t;
}
}
}
}
fout << rasp;
return 0;
}