Pagini recente » Cod sursa (job #2806467) | Cod sursa (job #1653299) | Cod sursa (job #84936) | Monitorul de evaluare | Cod sursa (job #1385803)
#include <fstream>
#include <vector>
#include <queue>
#define pb push_back
#define INF 0x3f3f3f3f
using namespace std;
ifstream is("maxflow.in");
ofstream os("maxflow.out");
int n, m;
vector<bool> ok;
vector<int> t;
vector<vector<int> > c, g;
void Read();
bool BFS();
int main()
{
Read();
int answ = 0, fmin;
t = vector<int>(n + 1);
while ( BFS() )
for ( vector<int>::iterator nodv = g[n].begin(); nodv != g[n].end(); ++nodv )
if ( ok[*nodv] && c[*nodv][n] > 0 )
{
fmin = INF;
t[n] = *nodv;
for ( int i = n; t[i]; i = t[i] )
fmin = min(fmin, c[t[i]][i]);
if ( fmin )
{
for ( int i = n; t[i]; i = t[i] )
{
c[t[i]][i] -= fmin;
c[i][t[i]] += fmin;
}
answ += fmin;
}
}
os << answ;
is.close();
os.close();
return 0;
}
bool BFS()
{
ok = vector<bool>(n + 1, 0);
queue<int> q;
q.push(1);
ok[1] = 1;
int nod;
while ( !q.empty() )
{
nod = q.front();
q.pop();
if ( nod == n )
continue;
for ( vector<int>::iterator nodv = g[nod].begin(); nodv != g[nod].end(); ++nodv )
if ( !ok[*nodv] && c[nod][*nodv] > 0 )
{
ok[*nodv] = true;
t[*nodv] = nod;
q.push(*nodv);
}
}
return ok[n];
}
void Read()
{
is >> n >> m;
int n1, n2, cost;
c = vector<vector<int> >(n + 1, vector<int>(n + 1));
g = vector<vector<int> >(n + 1);
while ( m-- )
{
is >> n1 >> n2 >> cost;
g[n1].pb(n2);
g[n2].pb(n1);
c[n1][n2] = cost;
}
}