gpt4 book ai didi

c++ - BGL : adjacency list returns wrong edge property for descriptor

转载 作者:行者123 更新时间:2023-11-30 03:53:02 25 4
gpt4 key购买 nike

我有一个存储为邻接表的图。顶点属性保存一个int ID,边缘属性保存一个4x4矩阵和一个权重;

在测试用例中,该图是一个 3 顶点图,每对顶点都有一条边连接(一个完整的图)。

我有一个边描述符 vector PathType,代表一条路径,我正在遍历它并访问每个边及其属性 RelationshipEdge,如下所示。

for(PathType::iterator pathIterator = path.begin(); pathIterator != path.end(); ++pathIterator){
edge_t edge = *pathIterator;
RelationshipEdge rEdge = m_graph[edge];
int sourceID = m_graph[boost::source(edge, m_graph)].id;
int destID = m_graph[boost::target(edge, m_graph)].id;

但是有时执行此操作时,返回的 RelationshipEdge 包含错误边的数据。

例如,检查 edge 显示 m_source 为 1 和 m_target 为 2。如果我检查图形并找到边源 1 和目标 2,权重为 3,矩阵与输入的一样。但是 rEdge 的权重为 1,并且矩阵不同。这些值实际上对应于源 0 和目标 1 的边。

我是否正确访问了边缘属性?

我的图表类型的定义是:

typedef boost::adjacency_list< 
boost::vecS, boost::vecS, boost::undirectedS, MarkerVertex, RelationshipEdge>
CorrelationAdjacencyList;

最佳答案

我相信您的错误来自代码库中的其他地方。

我将这个简单的代码放在一起来测试边缘访问和类似图形上的顺序,一切都按预期工作。

如 sehe 所述,可以手动维护 edge_descriptorsvertex_descriptors 罪魁祸首。或者您的路径 vector 初始化或构造。

#include <iostream>
#include <algorithm>
#include <vector>

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graph_traits.hpp>

using namespace std;

enum edge_t {A,B};

struct MarkerVertex{
std::string id;
};

struct RelationshipEdge{
std::string id;
};


typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS,
MarkerVertex, RelationshipEdge> CorrelationAdjacencyList;


typedef boost::graph_traits<CorrelationAdjacencyList>::edge_descriptor Edge;
typedef boost::graph_traits<CorrelationAdjacencyList>::vertex_descriptor Vertex;

typedef vector<Edge> PathType;


void printPath(PathType &p, CorrelationAdjacencyList &g){
cout << "print path" << endl;

for(PathType::iterator pi = p.begin(); pi != p.end(); ++pi){
Edge e = *pi;

Vertex s = boost::source(e,g);
Vertex t = boost::target(e,g);

cout << g[s].id << "\t"
<< g[e].id << "\t"
<< g[t].id << endl;

bool isFound;
Edge eForward;
boost::tie(eForward,isFound) = boost::edge(s,t,g);
cout << "forward " << g[eForward].id << "\t" << isFound << endl;

Edge eBackward;
boost::tie(eBackward,isFound) = boost::edge(t,s,g);
cout << "backward " << g[eBackward].id << "\t" << isFound << endl;
}
}


int main(int argc, char* argv[]){

CorrelationAdjacencyList graph;

Vertex a = boost::add_vertex(graph); graph[a].id = "a";
Vertex b = boost::add_vertex(graph); graph[b].id = "b";
Vertex c = boost::add_vertex(graph); graph[c].id = "c";

Edge e1 = boost::add_edge(a,b,graph).first; graph[e1].id = "e1";
Edge e2 = boost::add_edge(b,c,graph).first; graph[e2].id = "e2";
Edge e3 = boost::add_edge(c,a,graph).first; graph[e3].id = "e3";

PathType path1,path2,path3;

path1.push_back(e1);
path1.push_back(e2);
path1.push_back(e3);

path2.push_back(e2);
path2.push_back(e3);
path2.push_back(e1);

path3.push_back(e3);
path3.push_back(e2);
path3.push_back(e1);

printPath(path1,graph);
cout << endl;
printPath(path2,graph);
cout << endl;
printPath(path3,graph);


cin.get();
}

关于c++ - BGL : adjacency list returns wrong edge property for descriptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30323590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com