Pagini recente » Cod sursa (job #2409080) | Cod sursa (job #337949) | Istoria paginii utilizator/ancacraciun | Cod sursa (job #2484589) | Cod sursa (job #1393984)
#include <cstdio>
#include <vector>
#include <queue>
#define Nmax 1005
#define INF 2000000000
using namespace std;
int n,prevv[Nmax],C[Nmax][Nmax],F[Nmax][Nmax];
bool viz[Nmax];
vector <int> L[Nmax];
queue <int> Q;
inline bool Bfs()
{
int i,nod;
vector <int> ::iterator it;
Q.push(1); viz[1]=true;
for(i=2;i<=n;++i) viz[i]=false;
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])
{
prevv[*it]=nod; viz[*it]=true;
Q.push(*it);
}
}
return viz[n];
}
int main()
{
int m,x,y,z,i,flow=0,minflow;
freopen ("maxflow.in","r",stdin);
freopen ("maxflow.out","w",stdout);
scanf("%d%d", &n,&m);
while(m--)
{
scanf("%d%d%d", &x,&y,&z);
L[x].push_back(y);
L[y].push_back(x);
C[x][y]=z; C[y][x]=0;
}
while(Bfs())
{
minflow=INF;
for(i=n;i>1;i=prevv[i]) minflow=min(minflow,C[prevv[i]][i]-F[prevv[i]][i]);
flow+=minflow;
for(i=n;i>1;i=prevv[i])
{
F[prevv[i]][i]+=minflow;
F[i][prevv[i]]-=minflow;
}
}
printf("%d\n", flow);
return 0;
}