Pagini recente » Cod sursa (job #300876) | Cod sursa (job #1852913) | Cod sursa (job #858183) | Cod sursa (job #363374) | Cod sursa (job #331815)
Cod sursa(job #331815)
#include<fstream>
#include<vector>
#include<cstring>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
const int maxn=1005;
const int INF=0x3f3f3f3f;
vector<int>a[maxn];
int F[maxn][maxn],C[maxn][maxn];
int i,j,n,m,x,y,z,par[maxn];
bool been[maxn];
int coada[maxn];
bool bfs()
{
int x;
memset(been,false,sizeof(been));
been[1]=1;
par[1]=0;
int elem=1;
coada[1]=1;
int i;
for(i=1;i<=elem;++i)
{
x=coada[i];
if(x==n)
continue;
for(vector<int>::iterator it=a[x].begin();it!=a[x].end();++it)
if(been[*it]==false&&F[x][*it]!=C[x][*it])
coada[++elem]=*it,been[*it]=true,par[*it]=x;
}
return been[n];
}
int main()
{
f>>n>>m;
for(i=1;i<=m;++i)
{
f>>x>>y>>z;
C[x][y]+=z;
a[x].push_back(y);
a[y].push_back(x);
}
int flow,fmin;
for(flow=0;bfs();)
for(vector<int>::iterator it=a[n].begin();it!=a[n].end();++it)
{
if(F[*it][n]==C[*it][n]||been[*it]==false)
continue;
fmin=INF;
par[n]=*it;
for(i=n;i!=1;i=par[i])
fmin=min(fmin,C[par[i]][i]-F[par[i]][i]);
if(fmin==0)
continue;
for(i=n;i!=1;i=par[i])
F[par[i]][i]+=fmin,F[i][par[i]]-=fmin;
flow+=fmin;
}
g<<flow<<"\n";
f.close();
g.close();
return 0;
}