Pagini recente » Cod sursa (job #2864994) | Cod sursa (job #2778904) | Cod sursa (job #1813394) | Cod sursa (job #2943307) | Cod sursa (job #2694699)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int MAX_N = 1e3;
const int INF = 0x3f3f3f3f;
int n, m;
vector<int> adj[MAX_N];
int cap[MAX_N][MAX_N];
int flow[MAX_N][MAX_N];
bool visited[MAX_N];
int parent[MAX_N];
bool bfs()
{
queue<int> q;
q.push(1);
memset(visited, false, sizeof visited);
visited[1] = true;
while (!q.empty()) {
int current_node = q.front();
q.pop();
if (current_node == n) {
continue;
}
for (auto& neigh : adj[current_node]) {
if (cap[current_node][neigh] == flow[current_node][neigh] ||
visited[neigh]) {
continue;
}
visited[neigh] = true;
q.push(neigh);
parent[neigh] = current_node;
}
}
return visited[n];
}
int edmonds_karp() {
int max_flow = 0;
while (bfs()) {
for (auto& node : adj[n]) {
if (flow[node][n] == cap[node][n] || !visited[node]) {
continue;
}
parent[n] = node;
int current_flow = INF;
for (int crt_node = n; crt_node != 1; crt_node = parent[crt_node]) {
current_flow = min(current_flow,
cap[parent[crt_node]][crt_node] - flow[parent[crt_node]][crt_node]);
}
if (current_flow == 0) {
continue;
}
for (int crt_node = n; crt_node != 1; crt_node = parent[crt_node]) {
flow[parent[crt_node]][crt_node] += current_flow;
flow[crt_node][parent[crt_node]] -= current_flow;
}
max_flow += current_flow;
}
}
return max_flow;
}
int main()
{
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
cin >> n >> m;
for (int i = 0; i < m; i++)
{
int x, y, z;
cin >> x >> y >> z;
adj[x].push_back(y);
adj[y].push_back(x);
cap[x][y] += z;
}
cout << edmonds_karp();
return 0;
}