Пример #1
0
int costoMin(vector<Grafo::Vertice*> &camino, Grafo &g){
	int min = 10101;
	auto iter1 = camino.begin();
	for(auto iter2 = camino.begin()+1; iter2 != camino.end(); ++iter1,++iter2){
		int temp = g.buscarArista((*iter1)->nombre,(*iter2)->nombre)->costo;
		if(temp < min) min = temp;
	}
	return min;
}
Пример #2
0
Grafo flujoMaximo(Grafo &g, string a, string b){
	Grafo res(g.file);
	res.quitarCostos();
	auto tempA = g.vertices.find(a);
	auto tempB = g.vertices.find(b);
	if(tempA == g.vertices.end() or tempB == g.vertices.end()) return res;
	auto nodoA = tempA->second;
	auto nodoB = tempB->second;
	stack<Grafo::Vertice*> pila;
	vector<Grafo::Vertice*> camino;
	pila.push(nodoA);
	while(!pila.empty()){
		auto actual = pila.top();
		cout<<"N->"<<actual->nombre<<endl;
		if(actual->marcado){
			cout<<"1"<<endl;
			camino.pop_back();
			pila.pop();
			actual->marcado = false;
		}
		else if(actual == nodoB){
			cout<<"2"<<endl;
			camino.push_back(actual);
			int min = costoMin(camino, g);
			auto iter1 = camino.begin();
			for(auto iter2 = camino.begin()+1; iter2 != camino.end(); ++iter1,++iter2){
				g.buscarArista((*iter1)->nombre,(*iter2)->nombre)->costo -= min;
				res.buscarArista((*iter1)->nombre,(*iter2)->nombre)->costo += min;
			}
			camino.pop_back();
			pila.pop();
		}
		else{
			cout<<"3"<<endl;
			actual->marcado = true;
			camino.push_back(actual);
			for(auto iter = actual->vecinos.begin(); iter != actual->vecinos.end(); ++iter){
				cout<<"NN->"<<get<0>(*iter)->nombre<<endl;
				if(!get<0>(*iter)->marcado and get<1>(*iter) > 0) pila.push(get<0>(*iter));
			}
		}
	}
	return res;
}