Pagini recente » Cod sursa (job #75584) | Cod sursa (job #91549) | Cod sursa (job #1620252) | Cod sursa (job #922777) | Cod sursa (job #2649995)
#include <bits/stdc++.h>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
vector<int> g[1005];
int n, m;
vector<pair<int, pair<long long, long long>>> edges;
int prev_edge[1005];
int from[1005];
void bfs()
{
queue<int> q;
q.push(1);
for(int i = 1; i <= n; i++) { prev_edge[i] = -1; from[i] = 0; }
while(!q.empty())
{
int node = q.front(); q.pop();
for(int i = 0; i < g[node].size(); i++)
{
auto edge = edges[g[node][i]];
if(prev_edge[edge.first] == -1 && edge.first != 1 && edge.second.first < edge.second.second)
{
prev_edge[edge.first] = g[node][i];
from[edge.first] = node;
q.push(edge.first);
}
}
if(from[n] != 0) return;
}
}
long long EdmondsKarp()
{
long long flow = 0;
do
{
bfs();
if(prev_edge[n] != -1)
{
long long df = (long long)(1e18);
for(int index = n; index != 0; index = from[index])
{
int edge_index = prev_edge[index];
if(edge_index != -1)
df = min(df, edges[edge_index].second.second - edges[edge_index].second.first);
}
for(int index = n; index != 0; index = from[index])
{
int edge_index = prev_edge[index];
if(edge_index != -1)
{
edges[edge_index].second.first += df;
edges[edge_index ^ 1].second.first = edges[edge_index ^ 1].second.first - df;
}
}
flow += df;
}
} while(prev_edge[n] != -1);
return flow;
}
int main()
{
in >> n >> m;
for(int i = 0; i < m; i++)
{
int x, y; long long cap; in >> x >> y >> cap;
g[x].push_back(edges.size());
g[y].push_back(edges.size() + 1);
edges.push_back(make_pair(y, make_pair(0, cap)));
edges.push_back(make_pair(x, make_pair(0, 0LL)));
}
out << EdmondsKarp();
}