Pagini recente » Cod sursa (job #1999015) | Cod sursa (job #539110) | Cod sursa (job #1659424) | Cod sursa (job #424166) | Cod sursa (job #1526621)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
#define MAX 5010
typedef vector<int> :: iterator iter;
vector <int> G[MAX];
int C[MAX][MAX], F[MAX][MAX];
int q[MAX], st, dr, viz[MAX];
int nod, n, dad[MAX];
bool bfs()
{
st = 0;
dr = -1;
memset(viz, 0, sizeof(viz));
q[++dr] = 1;
viz[1] = 1;
while(st <= dr)
{
nod = q[st++];
for(iter it = G[nod].begin() ; it != G[nod].end() ; it++)
{
if(!viz[*it] && F[nod][*it] < C[nod][*it])
{
viz[*it] = 1;
q[++dr] = *it;
dad[*it] = nod;
}
}
}
return viz[n];
}
int main()
{
int m, x, y, flow, maxflow = 0, i;
fin >> n >> m;
while(m--)
{
fin >> x >> y;
fin >> C[x][y];
G[x].push_back(y);
G[y].push_back(x);
}
while(bfs())
{
for(iter it = G[n].begin() ; it != G[n].end() ; it++)
{
if(C[*it][n] - F[*it][n])
{
dad[n] = *it;
flow = 2000000000;
for(i = n ; dad[i] ; i = dad[i])
{
flow = min(flow, C[dad[i]][i] - F[dad[i]][i]);
}
for(i = n ; dad[i] ; i = dad[i])
{
F[dad[i]][i] += flow;
F[i][dad[i]] -= flow;
}
maxflow += flow;
}
}
}
fout << maxflow << "\n";
}