Pagini recente » Cod sursa (job #2195278) | Cod sursa (job #2023411) | Cod sursa (job #2557827) | Cod sursa (job #1398612) | Cod sursa (job #606059)
Cod sursa(job #606059)
# include <fstream>
# include <queue>
# include <vector>
using namespace std;
queue <int> Q;
vector <int> A[1000];
int n, m, F[1010][1010], C[1010][1010], dm[1010], x, y, z, flux;
inline int BFs ()
{
Q.push (1);
for (int i = 1; i <= n; ++i) dm[i] = 0;
dm[1] = 1;
for (; !Q.empty (); Q.pop ())
{
int ret = Q.front ();
for (vector <int> :: iterator it = A[ret].begin (); it != A[ret].end (); ++it)
if (F[ret][*it] < C[ret][*it] && dm[*it] == 0)
dm[*it] = ret, Q.push (*it);
}
return dm[n];
}
int main ()
{
ifstream f ("maxflow.in");
ofstream g ("maxflow.out");
f >> n >> m;
for (int i = 1; i <= m; ++i)
{
f >> x >> y >> z;
A[x].push_back (y);
A[y].push_back (x);
C[x][y] += z;
}
for (; BFs () > 0; )
{
for (vector <int> :: iterator it = A[n].begin (); it != A[n].end (); ++it)
{
if (!dm[*it]) continue ;
if (F[*it][n] == C[*it][n]) continue ;
int minflow = 0x3f3f3f3f;
dm[n] = *it;
for (int i = n; i > 1; i = dm[i])
minflow = min (minflow, C[dm[i]][i] - F[dm[i]][i]);
if (!minflow) continue ;
for (int i = n; i > 1; i = dm[i])
F[i][dm[i]] -= minflow, F[dm[i]][i] += minflow;
flux += minflow;
}
}
g << flux;
g.close ();
return 0;
}