Pagini recente » Cod sursa (job #2361810) | Cod sursa (job #392581) | Cod sursa (job #714204) | Cod sursa (job #1075100) | Cod sursa (job #1413346)
#include <stdio.h>
#include <vector>
#include <utility>
#include <queue>
#include <string.h>
#define NMax 1010
#define INF 1<<30
using namespace std;
std::vector<int> G[NMax];
std::queue<int> coada;
int n,m,flow,x,y,c,fmin;
int F[NMax][NMax],C[NMax][NMax],TT[NMax];
bool viz[NMax];
bool _BF(int x0,int y0)
{
memset(viz,0,sizeof(viz));
viz[x0] = 1;
coada.push(x0);
int nodx,nody;
while(!coada.empty())
{
nodx = coada.front();
coada.pop();
if (nodx == n) continue;
for(int i=0;i<G[nodx].size();++i)
{
nody = G[nodx][i];
if(C[nodx][nody]==F[nodx][nody]||viz[nody])continue;
viz[nody] = 1;
coada.push(nody);
TT[nody] = nodx;
}
}
return viz[y0];
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=1;i<=m;++i)
{
scanf("%d %d %d",&x,&y,&c);
C[x][y] += c;
G[x].push_back(y);
G[y].push_back(x);
}
int nodx,nody;
while(_BF(1,n))
{
for (int i=0;i<G[n].size();++i)
{
nodx = G[n][i];
if(C[nodx][n]==F[nodx][n]||!viz[nodx])continue;
TT[n] = nodx;
fmin = INF;
for(nodx=n;nodx!=1;nodx=TT[nodx])
{
fmin = min(fmin,C[TT[nodx]][nodx] - F[TT[nodx]][nodx]);
}
if(fmin == 0)continue;
for (nodx=n;nodx!=1;nodx=TT[nodx])
{
F[TT[nodx]][nodx]+=fmin;
F[nodx][TT[nodx]]-=fmin;
}
flow += fmin;
}
}
printf("%d",flow);
return 0;
}