Pagini recente » Cod sursa (job #750668) | Cod sursa (job #697598) | Cod sursa (job #639949) | Cod sursa (job #1154770) | Cod sursa (job #2638091)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <climits>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int NMAX = 1005;
/*
Citesc Graful
Cat timp reusesc sa fac drumuri augmentative cu bfs
Iau toate muciile care merg in destinatie
x = muchie
iau w capacitatea minima ramasa
updatez pathul mergand prin parinti (si alea reziduale)
adaug la flow
updatez muchia
resetez
1 e sursa
n e destinatia
*/
int p[NMAX];
vector<int>G[NMAX];
int cap[NMAX][NMAX];
int n, m, x, y, z;
queue<int>q;
void read()
{
fin >> n >> m;
while (m--)
{
fin >> x >> y >> z;
cap[x][y] = z;
G[x].push_back(y);
G[y].push_back(x);
}
}
int bfs()
{
while (!q.empty())
q.pop();
q.push(1);///sursa
while (!q.empty())
{
int u = q.front();
q.pop();
if (u == n) ///destinatie
break;
for (int v : G[u])
{
if (!p[v] && cap[u][v] > 0)
{
p[v] = u;
q.push(v);
}
}
}
return p[n]; /// de destinatie
/// in p am relatiile de parinti ca sa fac pathurile dupa
}
void solve()
{
int flux = 0;
while (bfs())
{
for (int v : G[n])
{
int capMin = cap[v][n];
for (int i = v; i != 1; i = p[i])
capMin = min(capMin, cap[p[i]][i]);
for (int i = v; i != 1; i = p[i])
{
cap[p[i]][i] -= capMin;
cap[i][p[i]] += capMin;
}
flux += capMin;
cap[v][n] -= capMin;
cap[n][v] += capMin;
}
for (int i = 0; i <= n; i++)
p[i] = 0;
}
fout << flux << "\n";
}
int main()
{
read();
solve();
return 0;
}