• c++ lemon how to copy a graph preserving the node id


    C++ lemon library provides a copy class DigraphCopy. However, this class does not preserve the node id between the newly created graph and old graph.
    To preserve the node id, we can manually create and delete the nodes for the new graph. Below is the function to make such copy happen:

    #include <lemon/list_graph.h>
    using namespace lemon;
    typedef ListDigraph::ArcMap<double> ArcMap;
    typedef ListDigraph::Node Node;
    typedef ListDigraph::Arc Arc;
    void digraph_copy(const ListDigraph& oldGraph, const ArcMap& oldArcMap, ListDigraph& G, ArcMap& A){
      for(int i = 0; i <= oldGraph.maxNodeId(); i++)
        G.addNode();
      for(ListDigraph::NodeIt n(G); n != INVALID; ++n){
        if(!oldGraph.valid(n))
           G.erase(n);
      }
      for(ListDigraph::ArcIt a(oldGraph); a != INVALID; ++a){
        Arc a1 = G.addArc(oldGraph.source(a), oldGraph.target(a));
        A[a1] = oldArcMap[a];
      } 
    }
    

    example usage:

    #include <iostream>
    int main(){
      ListDigraph G1;
      ArcMap A1(G1);
      Node n0 = G1.addNode();
      Node n1 = G1.addNode();
      Node n2 = G1.addNode();
      Arc a01 = G1.addArc(n0, n1);
      Arc a02 = G1.addArc(n0, n2);
      A1[a01] = 3;
      A1[a02] = 4;
      G1.erase(n1);
      ListDigraph G2;
      ArcMap A2(G2);
      digraph_copy(G1, A1, G2, A2);
      std::cout << countNodes(G2) << std::endl;
      std::cout << countArcs(G2) << std::endl;
      for(ListDigraph::NodeIt n(G2); n != INVALID; ++n){
        std::cout << G2.id(n) << std::endl;
      }
      for(ListDigraph::ArcIt a(G2); a != INVALID; ++a){
        std::cout << G2.id(G2.source(a)) << ' ' << G2.id(G2.target(a)) << std::endl;
        std::cout << A2[a] << std::endl;
      }
      return 0;
    }
    
  • 相关阅读:
    JS 日期加多少天,减多少天
    SQL 触发器
    SGU100
    连续子数组的最大和
    字符串的排列
    二叉搜索树与双向链表
    数组中出现次数超过一半的数字
    复杂链表的复制
    二叉树中和为某一值的路径
    二叉搜索树的后序遍历序列
  • 原文地址:https://www.cnblogs.com/zhaofeng-shu33/p/11336000.html
Copyright © 2020-2023  润新知