java邻接图_从文件构建Boost图(邻接列表)

使用add_edge(e1,e2,g)

当然可以!你对 adjacency_list<... vecs> 如何运作的假设是错误的 . 在这种情况下,顶点描述符是顶点索引,顶点是随机访问(由于 vecS ) .

如果要将数字设为读取"just" ID,请将它们设为顶点的属性,而不是直接将它们用作顶点索引 . 很可能你会想要为顶点容器使用一些基于节点的容器选择器(所以而不是 vecS ,例如 listS ) . 接下来,您可能需要与每个顶点关联的 id 或 name 属性 . 我可以建议一个捆绑的 property :

struct VertexProperty {

int id;

};

typedef boost::adjacency_list Graph;

std::istringstream iss(line);

if (iss >> e1 >> e2) {

// find or insert v1 and v2, e.g. insert by:

auto v1 = add_vertex(VertexProperty { e1 }, g);

auto v2 = add_vertex(VertexProperty { e2 }, g);

add_edge(v1, v2, g);

}

笔记:

通过id查找现有顶点作为练习(您可能需要查看http://www.boost.org/doc/libs/1_63_0/boost/graph/labeled_graph.hpp或者只是简单地保留id - > vertex_descriptor中的 Map . )

考虑修复变量的命名(调用顶点ID e1 令人困惑)

BONUS:labeled_graph演示

作为奖励,这是使用 labeled_graph 适配器的示例:

Live On Coliru

#include

#include

#include

#include

#include

using namespace boost;

typedef boost::adjacency_list AdjList;

typedef boost::labeled_graph Graph;

Graph get_graph(char* str1){

Graph g;

std::ifstream infile(str1);

std::string line;

while (std::getline(infile, line)) {

std::istringstream iss(line);

size_t vid1, vid2;

if (iss >> vid1 >> vid2) {

auto v1 = add_vertex(vid1, g);

auto v2 = add_vertex(vid2, g);

add_edge(v1, v2, g);

} else {

std::cerr << "Skipped invalid line '" << line << "'\n";

}

}

std::cout << num_vertices(g) << std::endl;

return g;

}

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

if (argc<2) return 255;

Graph g = get_graph(argv[1]);

}

哪些打印(用于示例输入):

18

这是正确的,因为 222261763 和 34428380 在10行(10x2 - 2 == 18个顶点)的输入中出现两次 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值