Pagini recente » Cod sursa (job #3331657) | Cod sursa (job #3355363) | Cod sursa (job #3350399) | Cod sursa (job #3311918) | Cod sursa (job #3338114)
/// patratele
#include <bits/stdc++.h>
using namespace std;
#define MOD 1000000003
#define NMAX 1010
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int i, start = 1, finish, n, m, a, b, c, mat[NMAX][NMAX], niv[NMAX], fr[NMAX], x, ras;
vector<int> v[1010];
queue<int> q;
void bfs(int nod)
{
for (i = 1; i <= n; i++)
{
niv[i] = -1;
fr[i] = 0;
}
niv[1] = 0;
q.push(nod);
while (!q.empty())
{
int p = q.front();
q.pop();
for (auto it : v[p])
{
if (niv[it] == -1 && mat[p][it] > 0)
{
niv[it] = niv[p] + 1;
q.push(it);
}
}
}
}
int dfs(int nod, int mini)
{
if (nod == n || mini == 0)
return mini;
while (fr[nod] < v[nod].size())
{
int p = v[nod][fr[nod]];
if (mat[nod][p] > 0 && niv[p] == niv[nod] + 1)
{
x = dfs(p, min(mini, mat[nod][p]));
if (x > 0)
{
mat[nod][p] -= x;
mat[p][nod] += x;
return x;
}
}
fr[nod]++;
}
return 0;
}
bool flux(int nod)
{
bfs(nod);
if (niv[n] == -1)
return 0;
int val = 0;
while (1)
{
x = dfs(nod, 1e9);
if (x == 0)
break;
val += x;
}
ras += val;
return (val != 0);
}
int main()
{
// ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
fin >> n >> m;
for (i = 1; i <= m; i++)
{
fin >> a >> b >> c;
v[a].push_back(b);
v[b].push_back(a);
mat[a][b] = c;
}
while (flux(start))
;
fout << ras;
}