Pagini recente » Cod sursa (job #147967) | Cod sursa (job #653650) | Cod sursa (job #1488707) | Cod sursa (job #2330724) | Cod sursa (job #2204969)
#include <bits/stdc++.h>
using namespace std;
bool se_poate(vector<vector<int> >&lista_adiacenta,int nod_terminal, vector<vector<int > >& flux,vector<vector<int> >&capacitate )
{
vector<bool> vizitat(nod_terminal+1,false);
vector<int> tati(nod_terminal+1,-1);
tati[1]=1;
vizitat[1]=true;
queue<int> coada;
coada.push(1);
while(!coada.empty())
{
int aux=coada.front();
coada.pop();
for(unsigned int i=0; i<lista_adiacenta[aux].size(); i++)
{
int y=lista_adiacenta[aux][i];
if(!vizitat[y]&&( capacitate[aux][y]>flux[aux][y] ) )
{
tati[y]=aux;
coada.push(y);
vizitat[y]=true;
}
}
}
if(tati[nod_terminal]==-1)return false;
int it=nod_terminal;
int min_fl=120000;
while(tati[it]!=it)
{
int rez=capacitate[tati[it]][it]-flux[tati[it]][it];
if(rez<min_fl)min_fl=rez;
it=tati[it];
}
it=nod_terminal;
while(tati[it]!=it)
{
flux[tati[it]][it]+=min_fl;
flux[it][tati[it]]-=min_fl;
it=tati[it];
}
return true;
}
int main()
{
vector<vector<int> > capacitati;
vector<vector<int> > flux;
vector<vector<int> > cost_graf_rezidual;
vector<vector<int> >lista_adiacenta_rez;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int nr_noduri;
in>>nr_noduri;
flux = vector< vector<int> >(nr_noduri+1, vector<int>(nr_noduri+1, 0));
capacitati = flux;
lista_adiacenta_rez=vector<vector<int> >(nr_noduri+1,vector<int>(0,0));
int nr_arce;
in>>nr_arce;
for(int i=0; i<nr_arce; i++)
{
int x,y,capacitate;
in>>x>>y>>capacitate;
lista_adiacenta_rez[x].push_back(y);
lista_adiacenta_rez[y].push_back(x);
capacitati[x][y]+=capacitate;
}
while(se_poate(lista_adiacenta_rez,nr_noduri,flux,capacitati)) {}
int sum=0;
for(unsigned int i=0; i<lista_adiacenta_rez[1].size(); i++)sum+=flux[1][lista_adiacenta_rez[1][i]];
out<<sum<<'\n';
return 0;
}