Pagini recente » Cod sursa (job #1286991) | Cod sursa (job #603922) | Cod sursa (job #2704226) | Cod sursa (job #2908741) | Cod sursa (job #606241)
Cod sursa(job #606241)
# include <fstream>
# include <queue>
# include <vector>
using namespace std;
queue <int> Q;
vector <int> A[1010];
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 (F[*it][n] < C[*it][n] && dm[*it])
{
int minflow = C[*it][n] - F[*it][n];
for (int i = *it; i > 1; i = dm[i])
minflow = min (minflow, C[dm[i]][i] - F[dm[i]][i]);
F[*it][n] += minflow, F[n][*it] -= minflow;
for (int i = *it; i > 1; i = dm[i])
F[dm[i]][i] += minflow, F[i][dm[i]] -= minflow;
flux += minflow;
}
g << flux;
g.close ();
return 0;
}