我正在写我的硕士论文,并试图从以下论文中实现一种新的最短路径算法:https://arxiv.org/abs/2203.03456
在一些函数中(例如ScaleDown),需要恒定的偏离度。常出度意味着图中每个顶点的出度是相同的。
本文提供了一种方法,在该方法中,您可以生成大小为in-dege+out-dege的零维循环,并用循环替换顶点。原始顶点的边将连接到循环。最短路径不会更改,因为您可以以零权重到达循环的每个入口或出口顶点。
我试过了,但如果你有更多的入边而不是出边,不是每个顶点都有相同的度。然后,我尝试只使用循环大小的出度,但如果一个顶点只有引入边,则不起作用。
以下是所述方法的代码:
graph_t最短路径::make_constant_out_degree(graph_tgraph,int num_vertices){//创建一个新图来存储扩展图。graph_t增强图;//映射以跟踪与原始顶点对应的新顶点。std::vector(boost::num_vertices(graph));//迭代所有顶点以创建循环。graph_t::顶点标识符vi,vi_end;for(tie(vi,vi_end)=顶点(图形);vi!=vi_结束++vi){//auto in_degree=boost::in_degere(*vi,graph);auto out_degree=boost::out_degere(*vi,graph);//循环的大小是in_degree和out_degre的总和。//size_t循环大小=in_degree+out_degree;size_t cycle_size=出格;//创建具有零权重边的循环。graph_t::vertex_descriptor prev_vertex=add_vertex(增强图);vertex_cycles[*vi].push_back(prev_vertex);对于(size_ti=1;i<cycle_size;++i){graph_t::vertex_descriptor new_vertex=add_vertex(增强的图形);顶点循环[*vi].push_back(new_vertex);add_edge(前顶点,新顶点,0,增强图);prev_vertex=新顶点;}//将最后一个顶点连接到第一个顶点以完成循环。add_edge(prev_vertex,vertex_cycles[*vi][0],0,augmented_graph);}打印图形(增强图形);//将相邻边附加到其相应的循环。graph_t::edge_iterator ei,ei_end;for(tie(ei,ei_end)=边(图);ei!=ei_结束++ei){//每条边在对应于源和目标的两个循环之间连接。vertex_descriptor src=源(*ei,图形);vertex_descriptor tgt=目标(*ei,图形);int weight=get(edge_weight,graph,*ei);//将边附加到两个循环中每个循环的任何顶点。从列表中删除顶点(如果使用)add_edge(顶点循环[src].back(),顶点循环[tgt].front(),权重,增强图);顶点循环[src].erase(std::删除(vertex_cycles[src].begin(),vertex_cycles[src].end(),vertex_ccycles[src].back()),顶点_循环[src].end());}返回增强图;}
有没有人知道另一种方法,可以将给定的图形转换为具有恒定偏差的图形,或者看到我正在犯的错误?