Pagini recente » Cod sursa (job #343111) | Cod sursa (job #2643055) | Cod sursa (job #2551463) | Cod sursa (job #1902793) | Cod sursa (job #1905672)
#include<bits/stdc++.h>
#define oo 0x3f3f3f3f
using namespace std;
FILE *in = fopen("maxflow.in", "r");
FILE *out = fopen("maxflow.out", "w");
const int NMAX = 1e3 + 5;
queue<int>Q;
int mat[NMAX][NMAX], N, M, parent[NMAX];
bool visited[NMAX];
void read()
{
fscanf(in, "%d%d", &N, &M);
for(int i = 1; i <= M; i ++)
{
int x, y, z;
fscanf(in, "%d%d%d", &x, &y, &z);
mat[x][y] = z;
}
}
void initialize()
{
memset(visited, false, sizeof(visited));
while(!Q.empty()) Q.pop();
int start_point = 1;
Q.push(start_point);
visited[start_point] = true;
parent[start_point] = -1;
}
bool bfs()
{
initialize();
while(!Q.empty())
{
int node = Q.front();
Q.pop();
for(int v = 1; v <= N; v++){
if( !visited[v] && mat[node][v] > 0 )
{
visited[v] = true;
parent[v] = node;
Q.push(v);
}
}
}
return (visited[N] == true);
}
int ford_fulkerson()
{
int u, v, max_flow = 0;
int s, t;
t = N; s = 1;
while(bfs())
{
int path_flow = INT_MAX;
for(v = t; v != s; v = parent[v])
{
u = parent[v];
path_flow = min(path_flow, mat[u][v]);
}
for(v = t; v != s; v = parent[v])
{
u = parent[v];
mat[u][v] -= path_flow;
mat[v][u] += path_flow;
}
max_flow += path_flow;
}
return max_flow;
}
int main()
{
read();
fprintf(out, "%d", ford_fulkerson());
return 0;
}