Pagini recente » Cod sursa (job #2296279) | Cod sursa (job #2260307) | Cod sursa (job #1029895) | Cod sursa (job #1601688) | Cod sursa (job #2289590)
#include <cstdio>
#include <queue>
#include <vector>
#define Nmax 1005
using namespace std;
int N,C[Nmax][Nmax],F[Nmax][Nmax],tata[Nmax];
bool viz[Nmax];
vector <int> L[Nmax];
queue <int> Q;
inline bool Bfs()
{
int i,nod;
vector<int>::iterator it;
for(i=2;i<=N;++i)
viz[i]=false;
viz[1]=true; Q.push(1);
while(!Q.empty())
{
nod=Q.front(); Q.pop();
if(nod==N) continue;
for(it=L[nod].begin();it!=L[nod].end();++it)
if(!viz[*it] && F[nod][*it]<C[nod][*it])
{
viz[*it]=true; tata[*it]=nod;
Q.push(*it);
}
}
return viz[N];
}
int main()
{
int M,x,y,z,flow=0,minflow,j;
vector<int>::iterator it;
freopen ("maxflow.in","r",stdin);
freopen ("maxflow.out","w",stdout);
scanf("%d%d", &N,&M);
while(M--)
{
scanf("%d%d%d", &x,&y,&z);
C[x][y]=z;
L[x].push_back(y);
L[y].push_back(x);
}
while(Bfs())
{
for(it=L[N].begin();it!=L[N].end();++it)
if(viz[*it])
{
minflow=C[*it][N]-F[*it][N];
for(j=*it;tata[j];j=tata[j])
minflow=min(minflow,C[tata[j]][j]-F[tata[j]][j]);
F[*it][N]+=minflow; F[N][*it]-=minflow;
for(j=*it;tata[j];j=tata[j])
{
F[tata[j]][j]+=minflow;
F[j][tata[j]]-=minflow;
}
flow+=minflow;
}
}
printf("%d\n", flow);
return 0;
}