Pagini recente » Cod sursa (job #3183656) | Cod sursa (job #1612370) | Cod sursa (job #1355242) | Cod sursa (job #435816) | Cod sursa (job #1887200)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define Inf 0xf3f3f3f3
#define NMAX 1005
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector <int> G[NMAX];
int C[NMAX][NMAX], F[NMAX][NMAX], n, m, visited[NMAX], fmin, FT[NMAX], flow;
int BFS(int node)
{
queue <int> Q;
int i, v;
Q.push(node);
visited[node] = 1;
while(!Q.empty())
{
v = Q.front();
Q.pop();
for(i = 0; i < G[v].size(); i++)
if(F[v][G[v][i]] < C[v][G[v][i]] && visited[G[v][i]] == 0)
{
Q.push(G[v][i]);
visited[G[v][i]] = 1;
FT[G[v][i]] = v;
if(G[v][i] == n)
return 1;
}
}
return 0;
}
int main()
{
int x, y, capacity, node, i;
fin >> n >> m;
for(i = 1; i <= m; i++)
{
fin >> x >> y >> capacity;
C[x][y] = capacity;
G[x].push_back(y);
G[y].push_back(x);
}
while(BFS(1))
{
fmin = Inf;
for(node = n; node != 1; node = FT[node])
fmin = min(fmin, C[FT[node]][node] - F[FT[node]][node]);
for(node = n; node != 1; node = FT[node])
{
F[FT[node]][node] += fmin;
F[node][FT[node]] -= fmin;
}
flow += fmin;
memset(visited, 0, sizeof(visited));
}
fout << flow << '\n';
return 0;
}