Pagini recente » Cod sursa (job #2289404) | Cod sursa (job #1618625) | Cod sursa (job #2904308) | Cod sursa (job #2801143) | Cod sursa (job #3193698)
#include <bits/stdc++.h>
using namespace std;
ifstream fin( "maxflow.in" );
ofstream fout( "maxflow.out" );
using ll = long long;
const int DIM = 505;
const ll INF = 1e18;
vector<int> G[DIM];
ll cap[DIM][DIM];
ll flow[DIM][DIM];
int viz[DIM];
void push_edge( int u, int v, int c ) {
G[u].push_back(v);
G[v].push_back(u);
cap[u][v] += c;
}
int prv[DIM];
int bfs( int s, int d ) {
queue<int> q;
for ( int i = 1; i <= d; ++i ) {
viz[i] = prv[i] = 0;
}
q.push(s);
viz[s] = 1;
while ( !q.empty() ) {
int u = q.front();
q.pop();
if ( u == d ) {
return 1;
}
for ( auto v : G[u] ) {
if ( !viz[v] && cap[u][v] > flow[u][v] ) {
prv[v] = u;
q.push(v);
viz[v] = 1;
}
}
}
return 0;
}
int main() {
int n, m, u, v, c;
fin >> n >> m;
for ( int i = 1; i <= m; ++i ) {
fin >> u >> v >> c;
push_edge(u, v, c);
}
ll res = 0;
while ( bfs(1, n) ) {
for ( auto w : G[n] ) {
if ( !viz[w] || cap[w][n] <= flow[w][n] ) continue;
prv[n] = w;
ll win = INF;
for ( u = n; u != 1; u = prv[u] ) {
win = min(win, cap[prv[u]][u] - flow[prv[u]][u]);
}
if ( win == 0 ) continue;
for ( u = n; u != 1; u = prv[u] ) {
flow[prv[u]][u] += win;
flow[u][prv[u]] -= win;
}
res += win;
}
}
fout << res;
fin.close();
fout.close();
return 0;
}