Pagini recente » Cod sursa (job #386897) | Cod sursa (job #3032104) | Cod sursa (job #316564) | Cod sursa (job #3032290) | Cod sursa (job #2202325)
#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int main()
{
vector<int> *Adiacenta;
queue<int> Coada;
int **Capacitate, **Flux, n, m, x, y, capacitate, OK = 1, *Vizitat, sursa, destinatie, *Tata, flux_maxim = 0;
fin >> n >> m;
Adiacenta = new vector<int>[n+100];
Capacitate = new int*[n+100]();
Vizitat = new int[n+100]();
Flux = new int*[n+100]();
Tata = new int[n+100]();
for(int i = 1 ; i <= n ; i++){
Capacitate[i] = new int[n+100]();
Flux[i] = new int[n+100]();
}
for(int i = 1 ; i <= m ; i++){
fin >> x >> y >> capacitate;
Adiacenta[x].push_back(y);
Capacitate[x][y] = capacitate;
}
fin >> sursa >> destinatie;
while(OK){
int Minim = 999999;
while(!Coada.empty())
Coada.pop();
Coada.push(sursa);
for(int i = 1 ; i <= n ; i++){
Vizitat[i] = 0;
Tata[i] = 0;
}
OK = 0;
Vizitat[sursa] = 1;
while(OK == 0 && Coada.size() != 0){
for(unsigned int j = 0 ; j < Adiacenta[Coada.front()].size() && OK == 0; j++){
if(Adiacenta[Coada.front()][j] == destinatie && Flux[Coada.front()][Adiacenta[Coada.front()][j]] < Capacitate[Coada.front()][Adiacenta[Coada.front()][j]]){
OK = 1;
Tata[destinatie] = Coada.front();
Vizitat[destinatie] = 1;
break;
}
else if(Vizitat[Adiacenta[Coada.front()][j]] == 0 && Flux[Coada.front()][Adiacenta[Coada.front()][j]] < Capacitate[Coada.front()][Adiacenta[Coada.front()][j]]){
Vizitat[Adiacenta[Coada.front()][j]] = 1;
Tata[Adiacenta[Coada.front()][j]] = Coada.front();
Coada.push(Adiacenta[Coada.front()][j]);
}
}
for(int j = 1 ; j <= n && OK == 0 ; j++){
if(Vizitat[j] == 0 && Flux[j][Coada.front()] != 0){
Coada.push(j);
Tata[j] = Coada.front();
Vizitat[j] = 1;
}
}
Coada.pop();
}
if(OK == 1){
int k = destinatie;
int k1 = Tata[k];
while(k1){
if(Capacitate[k1][k] != 0 && Minim > Capacitate[k1][k] - Flux[k1][k])
Minim = Capacitate[k1][k] - Flux[k1][k];
else if(Capacitate[k1][k] == 0 && Minim > Flux[k][k1] && Flux[k][k1] > 0)
Minim = Flux[k][k1];
k = k1;
k1 = Tata[k];
}
k = destinatie;
k1 = Tata[k];
while(k1){
if(Capacitate[k1][k] != 0)
Flux[k1][k] += Minim;
else Flux[k][k1] -= Minim;
k = k1;
k1 = Tata[k];
}
flux_maxim += Minim;
}
}
// for(int i = 1 ; i <= n ; i++){
// for(int j = 1 ; j <= n ; j++)
// cout << Flux[i][j] << ' ';
//cout<<endl;
//}
fout<<flux_maxim;
//delete [] Adiacenta; delete [] Tata; delete [] Vizitat;
//for(int i = 1 ; i <= n ; i++){
// delete [] Flux[i]; delete [] Capacitate[i];
//}
// delete [] Flux; delete [] Capacitate;
return 0;
}