Pagini recente » Cod sursa (job #1451304) | Cod sursa (job #234251) | Cod sursa (job #2916685) | Cod sursa (job #2380537) | Cod sursa (job #512515)
Cod sursa(job #512515)
#include<cstdio>
#include<vector>
#include<deque>
using namespace std;
vector<int> v[1001];
deque<int> Q;
int n,m,FL,D[1001],C[1001][1001],F[1001][1001],BF();
void read(),solve(),UPD();
int main()
{
read();
solve();
return 0;
}
void read()
{
int X,Y,Z;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
for(;m;m--)
{
scanf("%d%d%d",&X,&Y,&Z);
v[X].push_back(Y);
v[Y].push_back(X);
C[X][Y]=Z;
}
}
void solve()
{
for(;BF();)UPD();
printf("%d\n",FL);
}
int BF()
{
int N,i;
vector<int>::iterator it;
for(i=2;i<=n;i++)D[i]=0;D[1]=-1;
Q.resize(0);Q.push_back(1);
for(;Q.size();)
{
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;
D[*it]=N;
Q.push_back(*it);
if(*it==n)return 1;
}
Q.pop_front();
}
return 0;
}
void UPD()
{
int i,j,FC;
for(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(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(j=i;j!=1;j=D[j])
{
F[D[j]][j]+=FC;
F[j][D[j]]-=FC;
}
}
}