Pagini recente » Cod sursa (job #3127332) | Cod sursa (job #2782180) | Cod sursa (job #3127521) | Cod sursa (job #1614188) | Cod sursa (job #331810)
Cod sursa(job #331810)
#include<fstream>
#include<vector>
#include<queue>
#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];
queue<int>Q;
bool bfs()
{
int x;
memset(been,false,sizeof(been));
been[1]=1;
par[1]=0;
Q.push(1);
while(!Q.empty())
{
x=Q.front();
Q.pop();
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])
Q.push(*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)
{
fmin=INF;
if(F[*it][n]==C[*it][n]||!been[*it])
continue;
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;
}