Pagini recente » Cod sursa (job #1466844) | Cod sursa (job #1954779)
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
#define mp make_pair
#define pb push_back
using namespace std;
const int NMax = 1005;
const int MMax = 5005;
int N, M;
int flux[NMax][NMax];
int capa[NMax][NMax];
queue < pair < int, int > > Q;
vector < int > G[NMax];
void Read()
{
scanf("%d %d", &N, &M);
for(int i=1; i<=M; ++i)
{
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
G[x].push_back(y);
G[y].push_back(x);
capa[x][y]=z;
capa[y][x]=0;
flux[x][y]=0;
flux[x][y]=0;
}
}
int viz[NMax];
int dad[NMax];
int BFS()
{
memset(viz,0,sizeof(viz));
memset(dad,0,sizeof(dad));
Q.push(mp(1,0));
viz[1]=1;
while(!Q.empty())
{
int x=Q.front().first;
int y=Q.front().second;
Q.pop();
if(x == N)
continue;
vector < int > ::iterator it;
for(it=G[x].begin(); it!=G[x].end(); ++it)
{
if(!viz[*it] &&
capa[x][*it] > flux[x][*it])
{
viz[*it]=1;
dad[x]=y;
Q.push(mp(*it,x));
}
}
}
if(!viz[N])
return 0;
int mini = 0x3f3f3f3f;
for(vector<int>::iterator it = G[N].begin(); it!=G[N].end(); it++)
{
if(dad[N] == *it)
{
int nod=dad[N];
while(nod)
{
if(capa[nod][dad[nod]] - flux[nod][dad[nod]] < mini)
mini = capa[nod][dad[nod]] - flux[nod][dad[nod]];
nod=dad[nod];
}
nod=dad[N];
while(nod)
{
flux[nod][dad[nod]] += mini;
flux[dad[nod]][nod] -= mini;
nod=dad[nod];
}
}
}
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out","w",stdout);
int rez=0;
Read();
while(BFS())
{
rez=0;
for(vector<int>::iterator it = G[N].begin(); it!=G[N].end(); it++)
rez += flux[*it][N];
}
cout<<rez;
return 0;
}