Pagini recente » Cod sursa (job #2028024) | Cod sursa (job #1751176) | Cod sursa (job #380156) | Cod sursa (job #402111) | Cod sursa (job #2959958)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
int radacina, destinatie, n, m, n1, n2, cost, total;
int tati[1001], flux[1001][1001], viz[1001];
vector<vector<int>> adiacenta;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
bool bfs()
{
queue<int> q;
for(int i = 1; i <= n; ++i)
{
tati[i] = 0;
viz[i] = 0;
}
viz[1] = 1;
q.push(1);
while(!q.empty())
{
int aux = q.front();
q.pop();
for(auto element : adiacenta[aux])
{
if(viz[element] == 0 && flux[aux][element] > 0)
{
tati[element] = aux;
q.push(element);
viz[element] = 1;
if(element == n) return 1;
}
}
}
return 0;
}
int main()
{
f>>n>>m;
adiacenta.resize(n + 1);
for(int i = 1; i <= m; ++i)
{
f>>n1>>n2>>cost;
adiacenta[n1].push_back(n2);
adiacenta[n2].push_back(n1);
flux[n1][n2] = cost;
}
while(bfs())
{
for(auto element : adiacenta[n])
{
if(!viz[element]) continue;
int minim = INT_MAX;
int aux = n;
while(aux != 1)
{
minim = min(minim, flux[tati[aux]][aux]);
aux = tati[aux];
}
aux = n;
while(aux != 1)
{
flux[tati[aux]][aux] -= minim;
flux[aux][tati[aux]] += minim;
aux = tati[aux];
}
total += minim;
}
}
g<<total;
}