Pagini recente » Cod sursa (job #360976) | Cod sursa (job #1760407) | Cod sursa (job #1435698) | Cod sursa (job #3164467) | Cod sursa (job #2968703)
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
#include <climits>
using namespace std;
ifstream f ("maxflow.in");
ofstream g ("maxflow.out");
int n , i , x , y , c , m , graf[1005][1005] , parent [1005] , rezgraf[1005][1005];
bool bfs (int start , int stop)
{
bool viz[1005];
memset (viz , 0 , sizeof(viz));
queue < int > coada;
coada.push (start);
viz[start] = true;
parent[start] = -1;
while (!coada.empty ())
{
int u = coada.front ();
coada.pop ();
for (int i = 1 ; i <= n ; i++)
{
if (viz[i] == 0 && rezgraf[u][i] > 0)
{
if (i == stop)
{
parent[i] = u;
return true;
}
coada.push (i);
parent[i] = u;
viz[i] = 1;
}
}
}
return false;
}
int fordfulkerson (int start , int stop)
{
int u;
for (int i = 1 ; i <= n ; i++)
for (int j = 1 ; j <= n ; j++)
rezgraf[i][j] = graf[i][j];
int max_flow = 0;
while (bfs (start , stop))
{
int path_flow = INT_MAX;
for (int i = stop ; i != start ; i = parent[i])
{
u = parent[i];
path_flow = min(path_flow , rezgraf[u][i]);
}
for (int i = stop ; i != start ; i = parent[i])
{
u = parent[i];
rezgraf[u][i] -= path_flow;
rezgraf[i][u] += path_flow;
}
max_flow += path_flow;
}
return max_flow;
}
int main()
{
f >> n >> m;
for (int i = 1 ; i <= m ; i++)
{
f >> x >> y >> c;
graf[x][y] = c;
}
g << fordfulkerson ( 1 , n);
return 0;
}