Pagini recente » Cod sursa (job #584921) | Cod sursa (job #140291) | Cod sursa (job #624055) | Cod sursa (job #2426367) | Cod sursa (job #2589293)
//Dinic's algorithm
#include <fstream>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
const int NMAX = 1005;
const int INF = (1 << 30);
int N, M;
vector <int> graph[NMAX];
int flow[NMAX][NMAX], cap[NMAX][NMAX];
int dist[NMAX], last[NMAX];
bool bfs()
{
for (int i = 1; i <= N; ++i)
dist[i] = INF;
dist[1] = 1;
queue <int> q;
q.push(1);
while (!q.empty())
{
int node = q.front();
q.pop();
for (auto& x : graph[node])
if (dist[x] > dist[node] + 1 && flow[node][x] < cap[node][x])
{
dist[x] = dist[node] + 1;
q.push(x);
}
}
return (dist[N] != INF);
}
int dfs(int node, int deltaflow)
{
if (node == N)
return deltaflow;
else
{
for (int& p = last[node]; p < graph[node].size(); ++p)
{
int nextnode = graph[node][p];
if (dist[nextnode] == dist[node] + 1 && flow[node][nextnode] < cap[node][nextnode])
{
int currflow = dfs(nextnode, min(deltaflow, cap[node][nextnode] - flow[node][nextnode]));
if (currflow > 0)
{
flow[node][nextnode] += currflow;
flow[nextnode][node] -= currflow;
return currflow;
}
}
}
return 0;
}
}
int main()
{
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
fin >> N >> M;
for (int i = 1; i <= M; ++i)
{
int u, v, c;
fin >> u >> v >> c;
graph[u].push_back(v);
graph[v].push_back(u);
cap[u][v] += c;
}
int maxflow = 0;
while (bfs())
{
for (int i = 1; i <= N; ++i)
last[i] = 0;
int deltaflow = dfs(1, INF);
while (deltaflow > 0)
{
maxflow += deltaflow;
deltaflow = dfs(1, INF);
}
}
fout << maxflow << "\n";
fin.close();
fout.close();
return 0;
}