Pagini recente » Cod sursa (job #1586740) | Cod sursa (job #1798894) | Cod sursa (job #1419745) | Cod sursa (job #1704546) | Cod sursa (job #1173247)
#include <fstream>
#include <algorithm>
#include <bitset>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>
#if __cplusplus > 199711L
#include <unordered_map>
#include <unordered_set>
#endif
#include <cmath>
#include <cstring>
#include <cstdlib>
using namespace std;
const int inf = 0x3f3f3f3f;
int N, M;
int C[1010][1010], F[1010][1010], TT[1010];
vector<int> Graph[1010];
bool visited[1010];
bool BFS();
int main()
{
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int i, x, y, flow, fmin;
fin >> N >> M;
while(M--)
{
fin >> x >> y;
fin >> C[x][y];
Graph[x].push_back(y);
Graph[y].push_back(x);
}
for (flow = 0; BFS(); flow += fmin)
{
fmin = inf;
for (i = N; i != 1; i = TT[i])
fmin = min(fmin, C[TT[i]][i] - F[TT[i]][i]);
for (i = N; i != 1; i = TT[i])
F[i][TT[i]] = -(F[TT[i]][i] += fmin);
}
fout << flow << '\n';
fout.close();
return 0;
}
bool BFS()
{
int node, _node;
vector<int>::iterator it;
queue<int> Q;
memset(visited, 0, sizeof(visited));
visited[1] = true;
Q.push(1);
while(!Q.empty())
{
node = Q.front();
Q.pop();
for (it = Graph[node].begin(); it != Graph[node].end(); ++it)
{
_node = *it;
if (C[node][_node] == F[node][_node] || visited[_node]) continue;
visited[_node] = true;
Q.push(_node);
TT[_node] = node;
if (_node == N)
return true;
}
}
return false;
}