Pagini recente » Cod sursa (job #1754818) | Cod sursa (job #2057909) | Cod sursa (job #2000821) | Cod sursa (job #649541) | Cod sursa (job #2760098)
#include <bits/stdc++.h>
#define INF 100000000
using namespace std;
int coada[1005], st, dr, flux[1005][1005], capacity[1005][1005], dad[1005], n, m, i, x, y, z, flux_maximal;
bool seen[1005];
vector <int> v[1005];
bool BFS()
{
st = 1;
dr = 1;
coada[1] = 1;
memset(seen, false, sizeof(seen));
while(st <= dr)
{
int aux = coada[st];
st ++;
if(aux == n)continue;
for(int i = 0; i < v[aux].size(); i ++)
{
int aux1 = v[aux][i];
if(seen[aux1] == true || flux[aux][aux1] == capacity[aux][aux1])continue;
seen[aux1] = true;
dad[aux1] = aux;
coada[++ dr] = aux1;
}
}
return seen[n];
}
int aux, minn;
int main()
{
ifstream f("maxflow.in");
ofstream g("maxflow.out");
f >> n >> m;
for(i = 1; i <= m; i ++)
{
f >> x >> y >> z;
capacity[x][y] = z;
v[x].push_back(y);
v[y].push_back(x);
}
while(BFS())
{
for(int i = 0; i < v[n].size(); i ++)
{
int aux1 = v[n][i];
if(flux[aux1][n] == capacity[aux1][n] || seen[aux1] == false)continue;
minn = INF;
dad[n] = aux1;
aux = n;
while(aux != 1)
{
minn = min(minn, capacity[dad[aux]][aux] - flux[dad[aux]][aux]);
aux = dad[aux];
}
if(minn == 0)continue;
aux = n;
while(aux != 1)
{
flux[dad[aux]][aux] += minn;
flux[aux][dad[aux]] -= minn;
aux = dad[aux];
}
flux_maximal += minn;
}
}
g << flux_maximal;
return 0;
}