Pagini recente » Cod sursa (job #2917997) | Cod sursa (job #1114786) | Cod sursa (job #843056) | Cod sursa (job #892182) | Cod sursa (job #3156604)
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
struct Dinic {
int n;
struct edge {
int from;
int to;
int cap;
};
vector <edge> muchii;
vector <int> firstGood;
vector<vector <int>> edges;
vector <bool> viz;
vector <int> dist;
void init( int N ) {
n = N;
edges.resize( n );
viz.resize( n );
dist.resize( n );
firstGood.resize( n );
}
void addEdge( int a, int b, int c ) {
edges[a].push_back( muchii.size() );
muchii.push_back( (edge){ a, b, c } );
edges[b].push_back( muchii.size() );
muchii.push_back( (edge){ b, a, 0 } );
}
bool bfs( int source, int dest ) {
for ( int i = 0; i < n; i ++ ) {
dist[i] = n;
viz[i] = false;
}
queue <int> q;
q.push( source );
dist[source] = 0;
while ( !q.empty() ) {
int node = q.front();
q.pop();
viz[node] = true;
for ( auto i : edges[node] ) {
edge e = muchii[i];
if ( !viz[e.to] && e.cap && dist[node] + 1 < dist[e.to] ) {
dist[e.to] = dist[node] + 1;
q.push( e.to );
}
}
}
return dist[dest] != n;
}
int dfs( int node, int dest, int pushed = INF ) {
if ( pushed == 0 || node == dest ) return pushed;
viz[node] = true;
for ( int& i = firstGood[node]; i < edges[node].size(); i ++ ) {
int f = pushed, j = edges[node][i];
edge e = muchii[j];
if ( dist[e.to] == dist[node] + 1 && ( f = dfs( e.to, dest, min( pushed, e.cap ) ) ) ) {
muchii[j].cap -= f;
muchii[j^1].cap += f;
return f;
}
}
return 0;
}
int maxFlow( int source, int dest ) {
int maxflow = 0;
while ( bfs( source, dest ) ) {
for ( int i = 0; i < n; i ++ ) firstGood[i] = 0;
int flow = 0;
while ( ( flow = dfs( source, dest ) ) ) maxflow += flow;
}
return maxflow;
}
};
int main() {
ifstream fin( "maxflow.in" );
ofstream fout( "maxflow.out" );
int n, m;
fin >> n >> m;
Dinic graph;
graph.init( n );
for ( int i = 0, a, b, c; i < m; i ++ ) {
fin >> a >> b >> c;
graph.addEdge( a - 1, b - 1, c );
}
fout << graph.maxFlow( 0, n - 1 );
return 0;
}