Pagini recente » Cod sursa (job #328508) | Cod sursa (job #208246) | Cod sursa (job #519028) | Cod sursa (job #1830567) | Cod sursa (job #2811600)
#include <bits/stdc++.h>
#include<fstream>
#include<vector>
#include<map>
#include<queue>
int n, m, a, b, c;
class graf{
public:
std::vector< bool> viz;
std::vector< std::vector<int> > mat;
std::vector<std::vector<int> > lista;
std::vector<std::vector< std::pair<int, int>> > lista_cost;
std::vector< std::pair<int, int> > muchii;
void new_lista( int nod1, int nod2);
void new_lista_cost( int nod1, int nod2, int cost);
void afisare_lista_cost();
void solve_maxflow();
int BFS_maxflow(int start, int dest, std::vector<int> &tata, std::vector<std::vector<int>> &cap);
};
void graf::new_lista(int nod1, int nod2){
lista[nod1].push_back(nod2);
lista[nod2].push_back(nod1);
}
void graf::new_lista_cost(int nod1, int nod2, int cost) {
lista_cost[nod1].push_back(std::make_pair(nod2, cost));
lista_cost[nod2].push_back(std::make_pair(nod1, cost));
}
void graf::afisare_lista_cost() {
for(auto i=1 ; i<n+1 ; i++){
std::cout<<i<<" - ";
for( auto j = lista_cost[i].begin() ; j != lista_cost[i].end(); j++){
std::cout<<" ( "<< j->first<<" , "<<j->second<<" ) ";
}
std::cout<<"\n";
}
std::cout<<"\n";
}
int graf::BFS_maxflow(int start, int dest, std::vector<int> &tata, std::vector<std::vector<int>> &cap){
std::queue<std::pair<int, int>> coada;
for(int i=0 ; i<n ; i++){
tata[i] = -1;
}
tata[start] = -2;
coada.push(std::make_pair(start, INT_MAX));
while(!coada.empty()){
int nod = coada.front().first;
int flux = coada.front().second;
coada.pop();
for(auto vecin = lista[nod].begin(); vecin != lista[nod].end(); vecin++){
//std::cout<<nod<<" "<<*vecin<<" "<<cap[nod][*vecin]<<"\n";
if( tata[*vecin] == -1 && cap[nod][*vecin] >0){
tata[*vecin] = nod;
int flux_nou = std::min(flux, cap[nod][*vecin]);
if( *vecin == dest) return flux_nou;
coada.push(std::make_pair(*vecin, flux_nou));
}
}
}
return 0;
}
void graf::solve_maxflow() {
std::ifstream f("maxflow.in");
std::ofstream fg("maxflow.out");
f>>n>>m;
std::vector<std::vector<int> > cap;
std::vector<int> tata(n,0);
std::vector<int> v(n,0);
std::vector<int> l;
int start=0;
int dest=n-1;
for(auto i = 0; i<n ; i++){
lista.push_back(l);
cap.push_back(v);
}
for( int i=0 ; i<m ; i++){
f>>a>>b>>c;
lista[a-1].push_back(b-1);
cap[a-1][b-1] = c;
}
int flux = 0;
int flux_nou = BFS_maxflow(start, dest, tata, cap);
while(flux_nou){
flux += flux_nou;
int nod = dest;
while(nod != start){
int t = tata[nod];
cap[t][nod] -= flux_nou; //actualizezi flowul gasit + muchiile de intoarcere
cap[nod][t] += flux_nou;
nod = t;
}
flux_nou = BFS_maxflow(start, dest, tata, cap);
}
fg<<flux;
}
int main() {
graf g;
g.solve_maxflow( );
return 0;
}