Pagini recente » Borderou de evaluare (job #2521000) | Borderou de evaluare (job #641567) | Cod sursa (job #305062) | Cod sursa (job #2113061) | Cod sursa (job #2962359)
#include<iostream>
#include<fstream>
#include<queue>
#include<climits>
#include<vector>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n, m, s;
vector<vector<int>> la, capacitate;
vector<int> tata;
bool BFS()
{
queue<int> q;
vector<int> vizitat(n + 1);
for (int i = 1; i <= n; ++i) vizitat[i] = 0;
q.push(s);
tata[s] = -1;
vizitat[s] = 1;
while (!q.empty())
{
int u = q.front();
q.pop();
for (auto adiacent : la[u])
{
if (!vizitat[adiacent] && capacitate[u][adiacent])
{
tata[adiacent] = u;
if (adiacent == n) return 1;
vizitat[adiacent] = 1;
q.push(adiacent);
}
}
}
return 0;
}
int EdmondsKarp()
{
int fluxMax = 0;
while (BFS() == true)
{
int u, cn = n, flux = INT_MAX;
while (cn != s)
{
u = tata[cn];
if (capacitate[u][cn] < flux)
flux = capacitate[u][cn];
cn = tata[cn];
}
cn = n;
while (cn != s)
{
u = tata[cn];
capacitate[cn][u] += flux;
capacitate[u][cn] -= flux;
cn = tata[cn];
}
fluxMax += flux;
}
return fluxMax;
}
int main()
{
fin >> n >> m;
s = 1;
la.resize(n + 1);
capacitate.resize(n + 1, vector<int>(n + 1, 0));
tata.resize(n + 1, 0);
for (int i = 0; i < m; ++i)
{
int x, y, z;
fin >> x >> y >> z;
la[x].push_back(y);
la[y].push_back(x);
capacitate[x][y] = z;
}
fout << EdmondsKarp();
fin.close();
fout.close();
return 0;
}