Pagini recente » Cod sursa (job #1764797) | Cod sursa (job #1327401) | Cod sursa (job #1611716) | Cod sursa (job #6612) | Cod sursa (job #2638153)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
const int NMAX = 1000;
int N, M;
vector <int> g[NMAX + 2];
int cap[NMAX + 2][NMAX + 2], flow[NMAX + 2][NMAX + 2];
bool seen[NMAX + 2];
int bef[NMAX + 2];
bool bfs()
{
for(int i = 1; i <= N; i++)
seen[i] = false, bef[i] = 0;
queue <int> q;
q.push(1);
seen[1] = true;
while(!q.empty())
{
int node = q.front();
q.pop();
for(auto it : g[node])
if(flow[node][it] < cap[node][it])
if(!seen[it])
{
bef[it] = node;
q.push(it);
seen[it] = true;
}
}
return seen[N];
}
int main()
{
cin >> N >> M;
for(int i = 1; i <= M; i++)
{
int x, y, z;
cin >> x >> y >> z;
g[x].push_back(y);
g[y].push_back(x);
cap[x][y] = z;
}
int maxflo = 0;
while(bfs())
{
for(auto node : g[N])
{
int pumpFlo = cap[node][N] - flow[node][N];
for(int n = node; n != 1; n = bef[n])
pumpFlo = min(pumpFlo, cap[bef[n]][n] - flow[bef[n]][n]);
maxflo += pumpFlo;
flow[node][N] += pumpFlo;
flow[N][node] -= pumpFlo;
for(int n = node; n != 1; n = bef[n])
{
flow[bef[n]][n] += pumpFlo;
flow[n][bef[n]] -= pumpFlo;
}
}
}
cout << maxflo;
return 0;
}