Pagini recente » Cod sursa (job #1263695) | Cod sursa (job #1033749) | Cod sursa (job #2287250) | Cod sursa (job #1791132) | Cod sursa (job #1856231)
#include<fstream>
#include<vector>
#include<iostream>
#include<chrono>
#include<queue>
#include<algorithm>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int N, M;
int C[1010][1010];
int viz[1010];
int T[1010];
int S = 0;
queue<int> Q;
vector<int> G[1010];
bool BFS(int x)
{
Q.push(x);
for (int i = 1; i <= N; ++i)
T[i] = 0, viz[i] = 0;
viz[x] = 1;
while (Q.size())
{
int e = Q.front();
for (int i = 0; i < G[e].size(); ++i)
{
if (!viz[G[e][i]] && C[e][G[e][i]])
{
T[G[e][i]] = e;
viz[G[e][i]] = 1;
Q.push(G[e][i]);
}
}
Q.pop();
}
int ok = 0;
for (int i = 0; i < G[N].size(); ++i)
{
int p = G[N][i];
if (T[p] && C[G[N][i]][N])
{
int mn = C[G[N][i]][N];
while (T[p] != 0)
{
mn = min(mn, C[T[p]][p]);
p = T[p];
}
ok = 1;
p = G[N][i];
C[G[N][i]][N] -= mn;
C[N][G[N][i]] += mn;
while (T[p] != 0)
{
C[T[p]][p] -= mn;
C[p][T[p]] += mn;
p = T[p];
}
S += mn;
}
}
return ok;
}
int main()
{
in >> N >> M;
for (int i = 1; i <= M; ++i)
{
int x, y,w;
in >> x >> y >> w;
G[x].push_back(y);
G[y].push_back(x);
C[x][y] = w;
}
while (BFS(1)) {};
out << S;
return 0;
}