Pagini recente » Cod sursa (job #145595) | Cod sursa (job #2273057) | Cod sursa (job #169326) | Cod sursa (job #2603589) | Cod sursa (job #2873849)
#include <fstream>
#include <vector>
#include <queue>
std::ifstream fin("maxflow.in");
std::ofstream fout("maxflow.out");
typedef std::vector<std::vector<int>> mat;
int n, m, flow;
mat V, C;
std::vector<int> root;
inline void read()
{
int i, j, c;
fin >> n >> m;
V.resize(1LL * n + 1);
C.resize(1LL * n + 1);
root.resize(1LL * n + 1);
for (int i = 1; i <= n; ++i)
C[i].resize(1LL * n + 1);
for (int k = 1; k <= m; ++k)
{
fin >> i >> j >> c;
V[i].push_back(j);
V[j].push_back(i);
C[i][j] = c;
}
}
inline bool bfs(int k)
{
std::queue<int> Q;
Q.push(k);
fill(root.begin(), root.end(), 0);
while (!Q.empty())
{
k = Q.front(), Q.pop();
for (auto const& i : V[k])
if (!root[i] && C[k][i] > 0)
{
root[i] = k;
Q.push(i);
if (i == n)
return true;
}
}
return false;
}
inline void search(int const& start)
{
int cmin, i;
while (bfs(start))
{
cmin = 2e9, i = n;
while (i != start)
{
if (C[root[i]][i] < cmin)
cmin = C[root[i]][i];
i = root[i];
}
flow += cmin;
i = n;
while (i != start)
{
C[root[i]][i] -= cmin;
C[i][root[i]] += cmin;
i = root[i];
}
}
}
inline void display()
{
fout << flow;
}
int main()
{
read();
search(1);
display();
return 0;
}