Pagini recente » Profil lildobre | Profil zalosin | Cod sursa (job #2427425) | Cod sursa (job #2424912) | Cod sursa (job #2427430)
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;
int mat[20005][20005];
int viz[20005];
int minCut[20005];
int n, m;
int dfs(int node, int sink, int flux, int ind)
{
if (node == sink)return flux; //daca a ajuns la final
viz[node] = ind;
int i;
for (i = 1; i <= n; i++)
if (viz[i] != ind && mat[node][i] > 0) //daca nu a mai fost vizitat in parcurgea actuala
{
if (mat[node][i] < flux)flux = mat[node][i]; //alege capacitatea minima (bottleneck)
int dfsFlux = dfs(i, sink, flux, ind); //urmatorul nod
if (dfsFlux > 0) //dupa ce a parcurs tot drumul modifica matricea cu capacitatile noi
{
mat[node][i] -= dfsFlux;
//mat[i][node] += dfsFlux;
return dfsFlux;
}
}
return 0;
}
int main()
{
int i, x, y, c;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
f >> n >> m;
for (i = 0; i < m; i++)
{
f >> x >> y >> c;
mat[x][y] = c;
//matrice adiacenta
}
int indexViz = 1; //fiecare drum are un index
int maxFlux = 0;
int flux = 0;
for (;;)
{
flux = dfs(1, n, 200005, indexViz); //fluxul unui drum
indexViz++;
maxFlux += flux; //se adauga la fluxul maxim
if (flux == 0) { // daca nu s a mai gasit niciun drum
break;
}
}
g << maxFlux;
cout << maxFlux;
return 0;
}