zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    selinux 关闭
    Microsoft Visual Studio 2013 Language Pack
    Visual Studio Ultimate 2013 with Update 4
    页面滑动
    Android 适配器
    前端空格显示问题
    Your content must have a ListView whose id attribute is 'android.R.id.list'
    Ext.data.Store动态修改url
    Android 页面滑动
    实例化Layout中的布局文件(xml)
  • 原文地址:https://www.cnblogs.com/zhaofeng-shu33/p/11336000.html
Copyright © 2011-2022 走看看