Pagini recente » Cod sursa (job #2485549) | Cod sursa (job #628675) | Cod sursa (job #379049) | Cod sursa (job #2403546) | Cod sursa (job #2647397)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int INF = 1e17;
const int NMAX = 10005;
struct edge {
int y, pos, cap, f = 0;
edge() {}
edge(int y, int x, int cap){this->y = y;this->pos = x;this->cap = cap;}
};
vector<edge>g[NMAX];
int dist[NMAX], cap[NMAX][NMAX];
int n, m, s, t, a, b, c;
queue<int>q;
void addEdge(int x, int y, int cap)
{
g[x].push_back(edge(y, (int)g[y].size(), cap));
g[y].push_back(edge(x, (int)g[x].size() - 1, 0));
}
int bfs()
{
for (int i = 1; i <= n; i++)
dist[i] = -1;
dist[s] = 0;
q.push(s);
while (!q.empty())
{
int u = q.front();
q.pop();
for (edge v : g[u])
{
if (v.cap - v.f > 0 && dist[v.y] == -1)
{
dist[v.y] = dist[u] + 1;
q.push(v.y);
}
}
}
return (dist[t] != -1);
}
int dfs(int u, int flow)
{
if (u == t)
return flow;
for (int i = 0; i < g[u].size(); i++)
{
edge& e = g[u][i];
int remainingCapacity = e.cap - e.f;
if (remainingCapacity > 0 && dist[e.y] == dist[u] + 1)
{
int minCap = dfs(e.y, min(flow, remainingCapacity));
if (minCap > 0)
{
e.f += minCap; //muchia curenta
g[e.y][e.pos].f -= minCap;
return minCap;
}
}
}
return 0;
}
int maxFlow()
{
int flow = 0, minCap;
while (bfs())
{
while ( (minCap = dfs(s, INF)) && minCap > 0)
flow += minCap;
}
return flow;
}
int main()
{
fin >> n >> m;
s = 1;
t = n;
while (m--)
{
fin >> a >> b >> c;
addEdge(a, b, c);
}
fout << maxFlow() << "\n";
return 0;
}