Pagini recente » Cod sursa (job #1164352) | Cod sursa (job #1333317) | Cod sursa (job #2600203) | Cod sursa (job #1102106) | Cod sursa (job #2204932)
#include <iostream>
#include <fstream>
#define Nmax 1001
#include <queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector <int> muchii_graf[Nmax];
int matrice_capacitate[Nmax][Nmax];
int flux[Nmax][Nmax];
int n,m;
void Citire ()
{ int x,y,z;
fin>>n>>m;
for (int i=1;i<=m;i++)
{
fin>>x>>y>>z;
muchii_graf[x].push_back(y);
muchii_graf[y].push_back(x);
matrice_capacitate[x][y]=z;
}
}
bool BFS () //bfs de la sursa la destinatie
{
queue <int> c;
vector <int> tati(Nmax,0);
vector<int> viz(Nmax, 0);
int capacitate_reziduala_minima=2000000000;
viz[1]=1;
c.push(1);
while (!c.empty()) //stabilesc st-lantul
{
int nod=c.front();
c.pop();
for (int it:muchii_graf[nod])
if (viz[it]==0&&flux[nod][it]!=matrice_capacitate[nod][it])//ignor muchiile saturate
{
viz[it]=1;
c.push(it);
tati[it]=nod;
}
}
///Parcurg drumul inapoi si actualizez fluxul cu capacitatea_reziduala_minima
if (viz[n]!=1) return false;// nu s-a putut gasi un s-t lant nesaturat
//actualizez fluxul pe tot lantul
int nod=n;
while (tati[nod]!=0)
{
int aux=tati[nod];
if (matrice_capacitate[aux][nod]-flux[aux][nod]<capacitate_reziduala_minima)
capacitate_reziduala_minima=matrice_capacitate[aux][nod]-flux[aux][nod];
nod=tati[nod];
}
nod=n;
while (tati[nod]!=0)
{
int aux=tati[nod];
flux[aux][nod]+=capacitate_reziduala_minima;
flux[nod][aux]-=capacitate_reziduala_minima;
nod=tati[nod];
}
return true;
}
int main()
{int flux_maxim=0;
Citire();
while (BFS()==true);
for (int it:muchii_graf[1])
flux_maxim+=flux[1][it];
fout<<flux_maxim <<"\n";
return 0;
}