Pagini recente » Cod sursa (job #1258670) | Cod sursa (job #2458308) | Cod sursa (job #481863) | Cod sursa (job #2404688) | Cod sursa (job #2419446)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int nmax=1005;
vector<int> v[nmax];
int c[nmax][nmax],fl[nmax][nmax];
int lev[nmax],q[nmax],start[nmax];
int n,m,i,j,x,y,z,flow;
bool bfs()
{
int u,nod;
q[u=1]=1;
lev[1]=1;
for(i=2;i<=n;i++)
lev[i]=0;
for(int p=1;p<=u;p++)
{
x=q[p];
for(int i=0; i<v[x].size(); i++)
{
nod=v[x][i];
if(fl[x][nod]<c[x][nod]&&(!lev[nod]))
{
lev[nod]=lev[x]+1;
q[++u]=nod;
}
}
}
return (lev[n]!=0);
}
int dfs(int x,int minfl)
{
int nod=0,nxtfl=minfl;
if(!minfl) return 0;
if(x==n)
return minfl;
while(start[x]<v[x].size())
{
nod=v[x][start[x]];
if(lev[x]+1==lev[nod]&&fl[x][nod]<c[x][nod])
{
nxtfl=min(minfl,c[x][nod]-fl[x][nod]);
nxtfl=dfs(nod,nxtfl);
if(nxtfl)
{
fl[x][nod]+=nxtfl;
fl[nod][x]-=nxtfl;
return nxtfl;
}
}
start[x]++;
}
return 0;
}
int main()
{
ifstream f("maxflow.in");
ofstream g("maxflow.out");
f>>n>>m;
for(i=1;i<=m;i++)
{
f>>x>>y>>z;
c[x][y]=z;
v[x].push_back(y);
v[y].push_back(x);
}
while(bfs())
{
for(i=1;i<=n;i++)
start[i]=0;
bool ok=1;
int flux=0;
while(ok)
{
flux=dfs(1,(1<<30));
ok&=(flux!=0);
flow+=flux;
}
}
g<<flow;
return 0;
}