увеличить максимальный поток не компилируется при использовании шаблона diregraph?

Я хочу рассчитать максимальный поток с помощью библиотеки графиков наддува.
ОБНОВЛЕНИЕ В связи с запросом здесь полный код: +

CPP:

#include <iostream>
#include "PPINetwork.h"#include <boost/graph/kruskal_min_spanning_tree.hpp>
#include <boost/graph/graphviz.hpp>
#include <boost/graph/depth_first_search.hpp>
#include <boost/graph/dijkstra_shortest_paths.hpp>
#include <boost/graph/read_dimacs.hpp>
#include <boost/graph/boykov_kolmogorov_max_flow.hpp>
#include <boost/graph/push_relabel_max_flow.hpp>

#include "interactions.h"

using namespace std;

void PPINetwork::addEdge(string &p1, string &p2, double w){
Vertex s,e;
if(g.vertex(p1)==g.null_vertex()){
s = g.add_vertex(p1);
g.graph()[s].name = p1;
}
else
s = g.vertex(p1);
if(g.vertex(p2)==g.null_vertex()){
e = g.add_vertex(p2);
g.graph()[e].name = p2;
}
else
e = g.vertex(p2);

g.graph().add_edge(s,e,{1-w,w});

}

void PPINetwork::readNetwork(ifstream &ppin_file) {

// Create a graph object
string line;
std::getline(ppin_file, line); //skip header
while (std::getline(ppin_file, line)) {
std::istringstream iss(line);
string p1, p2;
float w;
if (!(iss >> p1 >> p2 >> w)) {
throw invalid_argument("line has wrong formaat\n" + line);
} // error
addEdge(p1,p2,w);
}
cout << "read " << boost::num_edges(g) << " Edges" << std::endl;
}

PPINetwork::PPINetwork(ifstream &file) {
readNetwork(file);
}

double PPINetwork::maxflow(vector<string> srcs,vector<string> sinks) {
//add common src and sink
vector<string> src_verticies;
vector<string> sink_verticies;
//filter out non existing verticies
for (string s: srcs) {
Vertex src_v = g.vertex(s);
if (src_v != g.null_vertex())
src_verticies.push_back(s);
}
for (string s: sinks) {
Vertex sink_v = g.vertex(s);
if (sink_v != g.null_vertex())
sink_verticies.push_back(s);
}
double max_double = std::numeric_limits<double>::max();
Vertex new_src = g.add_vertex("new_src");
Vertex new_sink = g.add_vertex("new_sink");
string ssrc = "new_src";
string ssink = "new_sink";
// add common sink and src
for (string &s : src_verticies) {
addEdge(ssrc, s, max_double);
}
for (string &s : src_verticies) {
addEdge(s, ssink, max_double);
}
auto capacity = boost::get(boost::edge_capacity, g);
auto reverse  = boost::get(boost::edge_reverse, g);
auto residcap = boost::get(boost::edge_residual_capacity, g);
auto indexmap = boost::get(boost::vertex_index, g);

double flow = boost::push_relabel_max_flow(g, new_src, new_sink,capacity,residcap, reverse, indexmap);
}

PPINetwork::PPINetwork() {

}

H-файл:

#ifndef UNTITLED_PPINETWORK_H
#define UNTITLED_PPINETWORK_H

#include <fstream>
#include <boost/graph/properties.hpp>
#include <boost/graph/undirected_graph.hpp>
#include <boost/graph/directed_graph.hpp>
#include <boost/graph/labeled_graph.hpp>
#include <vector>using namespace std;
struct VertexProperty
{
string name;
};
typedef boost::adjacency_list_traits<boost::vecS, boost::vecS, boost::directedS> Traits;
typedef boost::property<boost::edge_reverse_t, Traits::edge_descriptor> rev;
typedef boost::property<boost::edge_weight_t, double,
boost::property<boost::edge_capacity_t, double,
boost::property<boost::edge_residual_capacity_t, long,
rev > > > EdgeDesc;
typedef boost::labeled_graph<boost::directed_graph<VertexProperty,EdgeDesc>,std::string> diGraph;
typedef unordered_map<string,unordered_map<string,double>> ssf_map;
typedef  boost::graph_traits<diGraph>::vertex_descriptor Vertex;
typedef boost::graph_traits < diGraph >::edge_descriptor Edge;

class PPINetwork {
public:
PPINetwork();
PPINetwork(ifstream &ppin_file);
void addEdge(string &p1, string &p2, double w);
double maxflow(vector<string> srcs,vector<string> sinks);private:
void readNetwork(ifstream &ppin_file);
diGraph g;
};

#endif //UNTITLED_PPINETWORK_H

Когда я добавляю строку:

double flow = boost::push_relabel_max_flow(g, new_src,new_sink,capacity,residcap, reverse, indexmap);}

он не компилируется, хотя я предоставил все необходимые аргументы. Я получаю длинное нечитаемое сообщение об ошибке, но я думаю, что проблема связана с типом графика. Ошибки выглядят так:

ошибка: преобразование из ‘boost :: detail :: edge_desc_impl boost ::cted_tag, long long unsigned int’ в нескалярный тип
Boost :: Detail :: Push_relabel Boost :: Labeled_graph Boost :: Direct_graph VertexProperty …….

пришлось удалить <> указывает на то, что функция цитирования stackoverflows принимает ошибку

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]