Pagini recente » Cod sursa (job #2521578) | Cod sursa (job #1919984) | Cod sursa (job #976791) | Cod sursa (job #2189114) | Cod sursa (job #2961763)
#include <bits/stdc++.h>
using namespace std;
///infoarena maxflow
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector<vector<int>> lista, flux;
vector<int> viz, tata;
int n, m;
bool BFS()
{
int s = 1;
int d = n;
for(int i = 1; i <= n; i++)
{
viz[i] = 0;
tata[i] = 0;
}
queue<int> coada;
coada.push(s);
viz[s] = 1;
while(!coada.empty())
{
int nod = coada.front();
coada.pop();
for(int& vecin : lista[nod])
{
if(!viz[vecin] && flux[nod][vecin] > 0)
{
viz[vecin] = 1;
tata[vecin] = nod;
coada.push(vecin);
if(vecin == d)
return true;
}
}
}
return false;
}
int minFlow(){
int nod = n;
int minflux = INT_MAX;
while(nod != 1)
{
minflux = min(minflux, flux[tata[nod]][nod]);
nod = tata[nod];
}
return minflux;
}
void ex1(){
fin >> n >> m;
lista.resize(n + 1);
flux.resize(n + 1, vector<int>(n + 1, 0));
viz.resize(n + 1);
tata.resize(n + 1);
for(int i = 0; i < m; i++)
{
int x, y, c;
fin >> x >> y >> c;
lista[x].push_back(y);
lista[y].push_back(x);
flux[x][y] = c;
}
int maxflow = 0;
while(BFS())
{
int minflux = minFlow();
int nod = n;
while(nod != 1)
{
flux[tata[nod]][nod] -= minflux;
flux[nod][tata[nod]] += minflux;
nod = tata[nod];
}
maxflow += minflux;
}
fout << maxflow;
}
int main() {
ex1();
return 0;
}