Pagini recente » Cod sursa (job #984270) | Cod sursa (job #1836162) | Cod sursa (job #1742950) | Cod sursa (job #1820200) | Cod sursa (job #2965863)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int nrNoduri, nrMuchii;
vector<int> parinte;
vector<vector<int>> capacitate, graf;
int sursa, destinatie;
bool bfs()
{
vector<int> vizitat(nrNoduri + 1);
queue<int> q;
q.push(sursa);
vizitat[sursa] = 1;
parinte[sursa] = -1;
while(!q.empty())
{
int u = q.front();
q.pop();
for (auto v: graf[u])
{
if (vizitat[v] == 0 && capacitate[u][v] != 0)
{
parinte[v] = u;
if (v == destinatie)
return true;
vizitat[v] = 1;
q.push(v);
}
}
}
return false;
}
int EdmondsKarp()
{
int fluxMax = 0;
//cat inca exista un drum neviz
while(bfs())
{
int nod1, nod2;
nod2 = destinatie;
int capDrum = INT_MAX;
//parcurgere drum pentru a cauta capacitatea minima
while(nod2 != sursa)
{
nod1 = parinte[nod2];
if(capacitate[nod1][nod2] < capDrum)
capDrum = capacitate[nod1][nod2];
nod2 = parinte[nod2];
}
nod2 = destinatie;
//parcurgere drum pt a actualiza capacitatile muchiilor
while(nod2 != sursa)
{
nod1 = parinte[nod2];
capacitate[nod1][nod2] -= capDrum; // cap muchiei din graful initial scade
capacitate[nod2][nod1] += capDrum; // cap muchiei inverse creste
nod2 = parinte[nod2];
}
fluxMax = fluxMax + capDrum;
}
return fluxMax;
}
int main() {
fin >> nrNoduri >> nrMuchii;
sursa = 1;
destinatie = nrNoduri;
parinte.resize(nrNoduri + 1);
capacitate.resize(nrNoduri + 1, vector<int>(nrNoduri + 1));
graf.resize(nrNoduri + 1);
int nod1, nod2, cap;
for (int i = 1; i <= nrMuchii; i++)
{
fin >> nod1 >> nod2 >> cap;
graf[nod1].push_back(nod2);
graf[nod2].push_back(nod1);
capacitate[nod1][nod2] = cap;
}
fout << EdmondsKarp();
return 0;
}