Pagini recente » Cod sursa (job #2639838) | Cod sursa (job #2457276) | Cod sursa (job #430380) | Cod sursa (job #1139359) | Cod sursa (job #553990)
Cod sursa(job #553990)
#include<cstdio>
#include<vector>
#include<deque>
#define pb push_back
using namespace std;
int n,m,x,y,c,FL,D[1010],C[1010][1010],F[1010][1010],bfs();
vector<int> V[1010];
deque<int> Q;
void read(),solve(),upd();
int main()
{
read();
solve();
return 0;
}
void read()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
for(;m;m--)
{
scanf("%d%d%d",&x,&y,&c);
V[x].pb(y);
V[y].pb(x);
C[x][y]=c;
}
}
void solve()
{
for(;bfs();)
upd();
printf("%d\n",FL);
}
int bfs()
{
vector<int>::iterator it;
int N,i;
for(i=1;i<=n;i++)D[i]=0;D[1]=-1;
Q.resize(0);Q.pb(1);
for(;Q.size();Q.pop_front())
{
N=Q.front();
for(it=V[N].begin();it!=V[N].end();it++)
{
if(D[*it])continue;
if(C[N][*it]==F[N][*it])continue;
Q.pb(*it);
D[*it]=N;
if(*it==n)return 1;
}
}
return 0;
}
void upd()
{
int FC;
for(int i=1;i<=n;i++)
{
if(!D[i])continue;
if(C[i][n]==F[i][n])continue;
FC=C[i][n]-F[i][n];
for(int j=i;j!=1;j=D[j])
FC=FC<C[D[j]][j]-F[D[j]][j]?FC:C[D[j]][j]-F[D[j]][j];
if(!FC)continue;
FL+=FC;
F[i][n]+=FC;
F[n][i]-=FC;
for(int j=i;j!=1;j=D[j])
{
F[j][D[j]]-=FC;
F[D[j]][j]+=FC;
}
}
}