Pagini recente » Cod sursa (job #2208341) | Cod sursa (job #7526) | Cod sursa (job #3123634) | Cod sursa (job #245387) | Cod sursa (job #623638)
Cod sursa(job #623638)
#include <cstdio>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
#define N 1024
int fl[N][N],n,m,c[N][N],tata[N],sol;
vector<int> g[N];
void read ()
{
ifstream in ("maxflow.in");
in>>n>>m;
for(int x,y,cst,i=1;i<=m;++i){
in>>x>>y>>cst;
c[x][y]=cst;
g[x].push_back(y);
}
}
bool bf ()
{
vector<bool> uz(n+1,0);
queue<int> q;
uz[1]=1;
for(q.push(1);q.size();q.pop()){
int nd=q.front();
if(nd!=n)
for(vector<int>::iterator it=g[nd].begin();it<g[nd].end();++it)
if(!uz[*it]&&fl[nd][*it]<c[nd][*it]){
tata[*it]=nd;
uz[*it]=1;
q.push(*it);
}
}
return uz[n];}
void solve ()
{
while (bf()){
for(int i=1;i<n;++i)
if(tata[i]&&fl[i][n]<c[i][n]){
int mm=c[i][n]-fl[i][n];
for(int j=i;j!=1;j=tata[j])
if(c[tata[j]][j]-fl[tata[j]][j]<mm)
mm=c[tata[j]][j]-fl[tata[j]][j];
if(mm){
fl[i][n]+=mm;
fl[n][i]-=mm;
for(int j=i;j!=1;j=tata[j]){
fl[tata[j]][j]+=mm;
fl[j][tata[j]]-=mm;
}
sol+=mm;
}
}
}
}
void out ()
{
freopen ("maxflow.out","w",stdout);
printf("%d\n",sol);
}
int main ()
{
read ();
solve ();
out ();
return 0;}