Pagini recente » Cod sursa (job #723478) | Cod sursa (job #867252) | Cod sursa (job #2953705) | Cod sursa (job #794136) | Cod sursa (job #965265)
Cod sursa(job #965265)
//BEGIN CUT
#include <algorithm>
#include <climits>
#include <fstream>
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
//END CUT
const size_t MAXN = 5010;
vector<int> graph[MAXN];
bool visited[MAXN];
int parent[MAXN], bf_queue[MAXN],
capacity[MAXN][MAXN], flow[MAXN][MAXN];
bool find_path(int start, int destination) {
memset(visited, 0, sizeof(visited));
visited[start] = true;
int queue_sz = 1;
bf_queue[0] = start;
for (int i = 0; i < queue_sz; ++i)
{
int u = bf_queue[i];
for (int &v : graph[u])
{
if (capacity[u][v] == flow[u][v] || visited[v])
continue;
visited[v] = true;
bf_queue[queue_sz++] = v;
parent[v] = u;
}
}
return visited[destination];
}
int max_flow (int source, int sink)
{
int maxflow = 0;
while (find_path(source, sink))
for (int &v : graph[sink])
{
if (capacity[v][sink] == flow[v][sink] || !visited[v])
continue;
int bottleneck = INT_MAX;
for (int u = sink; u != source; u = parent[u])
bottleneck = min(bottleneck,
capacity[parent[u]][u] - flow[parent[u]][u]);
if (bottleneck == 0) continue;
for (int u = sink; u != source; u = parent[u])
{
flow[parent[u]][u] += bottleneck;
flow[u][parent[u]] -= bottleneck;
}
maxflow += bottleneck;
}
return maxflow;
}
//BEGIN CUT
int main()
{
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int nr_vertices, nr_edges;
fin >> nr_vertices >> nr_edges;
for (; nr_edges; --nr_edges)
{
int u, v, c;
fin >> u >> v >> c;
capacity[u][v] = c;
graph[u].push_back(v);
graph[v].push_back(u);
}
fout << max_flow(1, nr_vertices) << endl;
fout.close();
return 0;
}
//END CUT