Pagini recente » Cod sursa (job #1610998) | Cod sursa (job #2224310) | Cod sursa (job #1368014) | Cod sursa (job #2637371) | Cod sursa (job #3260349)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int dim = 1002;
int n, flux[dim][dim], capacitate[dim][dim], coada[dim], tata[dim], max_flow;
bool viz[dim];
vector<int> a[dim];
bool bfs (int sursa, int dest)
{
for (int i = 1; i <= n; i++)
viz[i] = 0;
int st = 1, dr = 0;
bool ok = 0;
coada[++dr] = sursa;
tata[sursa] = 0;
viz[sursa] = 1;
while (st <= dr && ok == 0)
{
int x = coada[st];
for (int y : a[x])
if (!viz[y] && capacitate[x][y] - flux[x][y] > 0)
{
coada[++dr] = y;
viz[y] = 1;
tata[y] = x;
if (y == dest)
ok = 1;
}
st++;
}
if (!ok)
return 0; ///nu am gasit drum sursa->dest
int x = dest, minim = INT_MAX;
vector<int>w;
while (x != 0)
{
///reconstuim drumul
w.push_back(x);
x = tata[x];
}
for (int i = 0, j = w.size() - 1; i < j; i++, j--)
swap(w[i], w[j]);
for (int i = 0; i < w.size() - 1; i++)
{
///w[i] ---> w[i+1]
minim = min(minim, capacitate[w[i]][w[i+1]] - flux[w[i]][w[i+1]]);
}
for (int i = 0; i < w.size() - 1; i++)
{
flux[w[i]][w[i+1]] += minim;
flux[w[i+1]][w[i]] -= minim;
}
///fout << minim<<endl;
max_flow += minim;
return 1;
}
int main()
{
int m, x, y, z, ok = 1;
fin >> n >> m;
while (m--)
{
fin >> x >> y >> z;
capacitate[x][y]=z;
a[x].push_back(y);
a[y].push_back(x);
}
do
{
ok = bfs(1, n);
}while (ok);
fout << max_flow;
return 0;
}