Pagini recente » Cod sursa (job #1016889) | Cod sursa (job #1871741) | simulare_de_oni_1 | Cod sursa (job #1592206) | Cod sursa (job #2908739)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1000;
ifstream fin( "maxflow.in" );
ofstream fout( "maxflow.out" );
pair <int, int> edges[NMAX+1][NMAX+1];
int source, dest;
bool viz[NMAX+1];
int parent[NMAX+1];
int n;
void dfs( int node ) {
int i;
viz[node] = true;
if( node != dest ) {
for( i = 1; i <= n; i++ ) {
if( !viz[i] && edges[node][i].first != edges[node][i].second ) {
dfs( i );
parent[i] = node;
}
}
}
}
int main() {
int m, a, b, c, in, out, node, mini, val, flow, i, j;
fin >> n >> m;
for( i = 0; i < m; i++ ) {
fin >> a >> b >> c;
edges[a][b] = { 0, c };
edges[b][a] = { -1, -1 };
}
for( i = 1; i <= n; i++ ) {
in = out = 0;
for( j = 1; j <= n; j++ ) {
if( edges[i][j].second > 0 )
out++;
else if( edges[i][j].second < 0 )
in++;
}
if( in == 0 )
source = i;
if( out == 0 )
dest = i;
}
dfs( source );
flow = 0;
while( viz[dest] == true ) {
node = dest;
mini = 1e9;
while( node != source ) {
if( edges[parent[node]][node].first < 0 )
val = - edges[parent[node]][node].first - 1;
else
val = edges[parent[node]][node].second - edges[parent[node]][node].first;
node = parent[node];
mini = min( mini, val );
}
node = dest;
while( node != source ) {
edges[parent[node]][node].first += mini;
edges[node][parent[node]].first -= mini;
node = parent[node];
}
flow += mini;
for( i = 1; i <= n; i++ ) {
viz[i] = false;
parent[i] = 0;
}
dfs( source );
}
fout << flow;
return 0;
}