Pagini recente » Cod sursa (job #822147) | Cod sursa (job #2377894) | Cod sursa (job #854656) | Cod sursa (job #1008230) | Cod sursa (job #2873856)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f ("maxflow.in");
ofstream g ("maxflow.out");
queue<int>q;
vector<int> adiacenta[1011];
int capacitate[1011][1011];
bool viz[1011];
int n,m,x,y,c,rasp;
int tati[1011];
void citire()
{
f >> n>> m;
for(int i = 1;i<=m;i++)
{
f >> x >> y >> c;
adiacenta[x].push_back(y);
//invers e pentru muchia cu cost negativ
adiacenta[y].push_back(x);
capacitate[x][y] = c;
}
}
void init()
{
for(int i = 1;i<=n;i++)
viz[i] = 0;
}
bool BFS()
{
init();
q.push(1);
viz[1] =1;
while(!q.empty())
{
int curent = q.front();
q.pop();
if(curent == n)
continue;
for(auto x:adiacenta[curent])
{
if(capacitate[curent][x] && !viz[x])
{
viz[x] = 1;
tati[x] = curent;
q.push(x);
}
}
}
//cat gasesc drumuri constinui whileul
return viz[n];
}
void alg()
{
while(BFS())
{
for(auto x:adiacenta[n])
{
if(viz[x]&&capacitate[x][n])
{
//chiar daca in adiacenta de n sunt muchii de la n de la x
//modul in care le am creat ne arata ca sunt si de la x la n(ceea ce ne trebuie noua)
tati[n] = x;
int maxim_capacitate_pe_drum = (1<<30)-1;
int nod_start = n;
while(nod_start!=1)
{
maxim_capacitate_pe_drum = min(maxim_capacitate_pe_drum,capacitate[tati[nod_start]][nod_start]);
nod_start = tati[nod_start];
}
nod_start = n;
if(maxim_capacitate_pe_drum==0)
continue;
while(nod_start!=1)
{
capacitate[tati[nod_start]][nod_start] -=maxim_capacitate_pe_drum;
capacitate[nod_start][tati[nod_start]] +=maxim_capacitate_pe_drum;
nod_start = tati[nod_start];
}
rasp+=maxim_capacitate_pe_drum;
}
}
}
}
int main()
{
citire();
alg();
g << rasp;
}