2015-03-03 51 views
0

我試圖從圖中複製的優勢,並將其添加到另一個(他所有的頂點和屬性)及其屬性的邊緣,我做出這樣的:複製與相鄰頂點和使用BOOST

if (!dataG.empty()) 
    { 
     auto const& gr = dataG.front(); // firslt graph in G_list 


     auto ep = edges(gr).first; //first edge in gr 

      vertex_t from = source(*ep, gr); 
     vertex_t to = target(*ep, gr); 
     boost::property_map<Graph, int VertexProperties::*>::type idmap = boost::get(&VertexProperties::id, testg); 
     boost::property_map<Graph, int VertexProperties::*>::type labelmap = boost::get(&VertexProperties::label, testg); 
     idmap[from] = gr[from].id; 
     labelmap[from] = gr[from].label; 
     boost::add_vertex(VertexProperties(idmap[from], labelmap[from]), testg); 
     idmap[to] = gr[to].id; 
     labelmap[to] = gr[to].label; 
     boost::add_vertex(VertexProperties(idmap[to], labelmap[to]), testg); 


     boost::add_edge(from, to, gr[*ep], testg);  
    } 

我得到這個錯誤:

segmentation error core dumped 

完整的源代碼是在這裏http://pastebin.com/vzCDbTiB

樣品輸入:http://pastebin.com/g4cgaHJB

+0

您是否調試過分段錯誤的來源? (哪條線) – 2015-03-03 08:18:42

+0

我不知道這行,但我認爲是其中之一: '的idMap [從] = GR [從] .ID; labelmap [from] = gr [from] .label; 升壓:: add_vertex(VertexProperties(的idMap [從],標記圖[從]),testg); idmap [to] = gr [to] .id; labelmap [to] = gr [to] .label; boost :: add_vertex(VertexProperties(idmap [to],labelmap [to]),testg); boost :: add_edge(from,to,gr [* ep],testg);' – 2015-03-03 08:23:15

+0

然後我建議使用調試器並逐行行走。你將能夠看到什麼是錯的。 – 2015-03-03 08:24:01

回答

2

要插入邊緣,以便頂點的數量就會自動調節,以適應源和目標的邊緣。

然後,只是他們的捆綁複製頂點屬性,無需與成員專用地圖染指(這些,當你想通過特定的屬性例如算法是有用的)。

這裏的簡化版本:

auto const& gr = dataG.front(); // firslt graph in G_list 
    auto ep = edges(gr).first; // first edge in gr 

    vertex_t from = source(*ep, gr); 
    vertex_t to = target(*ep, gr); 

    Graph::edge_descriptor copied_edge = boost::add_edge(from, to, gr[*ep], testg).first; 

    testg[source(copied_edge, testg)] = gr[from]; 
    testg[target(copied_edge, testg)] = gr[to]; 

活樣本:

Live On Coliru

#include <boost/graph/adjacency_list.hpp> 
#include <fstream> 
#include <iostream> 
#include <string> 
#include <vector> 
#include <ctime> 

/*********************************************/ 
// vertex 
struct VertexProperties { 
    int id; 
    int label; 
    VertexProperties(unsigned i = 0, unsigned l = 0) : id(i), label(l) {} 
}; 

// edge 
struct EdgeProperties { 
    unsigned id; 
    unsigned label; 
    EdgeProperties(unsigned i = 0, unsigned l = 0) : id(i), label(l) {} 
}; 

// Graph 
struct GraphProperties { 
    unsigned id; 
    unsigned label; 
    GraphProperties(unsigned i = 0, unsigned l = 0) : id(i), label(l) {} 
}; 

// adjency list 
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, VertexProperties, EdgeProperties, GraphProperties> 
    Graph; 

// descriptors 

typedef boost::graph_traits<Graph>::vertex_descriptor vertex_t; 
typedef std::pair<boost::graph_traits<Graph>::edge_descriptor, bool> edge_t; 
// iterators 
typedef boost::graph_traits<Graph>::vertex_iterator vertex_iter; 
typedef boost::graph_traits<Graph>::edge_iterator edge_iter; 

int main() 
{ 
    clock_t start = std::clock(); 
    std::vector<Graph> dataG; 

    std::ifstream file_reader("5.txt"); // flux d'entrée pour opérer sur les fichiers. 
    // ifstream * file_reader= new ifstream("60.txt"); //flux d'entrée pour opérer sur les fichiers. 

    std::string line; 
    while (std::getline(file_reader, line)) { // getline reads characters from an input stream and places them into a string 

     char lineType; 

     std::stringstream ss(line); // use a string buffer that contains a sequence of characters. 
     if (ss >> lineType) 
      switch (lineType) { 
       case 't': { 
        char diez; 
        unsigned gid; 
        if (ss >> diez >> gid) { 
         dataG.emplace_back(GraphProperties(gid, gid)); 
        } else 
         throw std::runtime_error("Error parsing '" + line + "'"); 
       } break; 
       case 'v': { 
        assert(!dataG.empty()); 

        int vId, vLabel; 
        if (ss >> vId >> vLabel) { 
         boost::add_vertex(VertexProperties(vId, vLabel), dataG.back()); 
        } else 
         throw std::runtime_error("Error parsing '" + line + "'"); 
       } break; 
       case 'e': { 
        assert(!dataG.empty()); 

        int fromId, toId, vLabel; 
        if (ss >> fromId >> toId >> vLabel) { 
         // Note that the EdgeProperty.id doesn't make sense with your input data 
         // as it only contains [vertexFrom vertexTo edgeData] 
         boost::add_edge(fromId, toId, EdgeProperties(vLabel, vLabel), dataG.back()); 
        } else 
         throw std::runtime_error("Error parsing '" + line + "'"); 
       } break; 
      } 
     else { 
      // ignoring empty line 
     } 
    } 

    Graph testg; 
    if (!dataG.empty()) { 
     auto const& gr = dataG.front(); // firslt graph in G_list 
     auto ep = edges(gr).first; // first edge in gr 

     vertex_t from = source(*ep, gr); 
     vertex_t to = target(*ep, gr); 

     Graph::edge_descriptor copied_edge = boost::add_edge(from, to, gr[*ep], testg).first; 

     testg[source(copied_edge, testg)] = gr[from]; 
     testg[target(copied_edge, testg)] = gr[to]; 
    } 

    typedef std::pair<edge_iter, edge_iter> edge_pair; 

    // int c = 0; //compteur de dataG 

    //++c; 
    std::cout << "Graph contains " << num_vertices(testg) << " vertices, and " << num_edges(testg) << " edges" << std::endl; 
    // Vertex list 
    std::cout << " Vertex list: " << std::endl; 
    for (size_t i = 0; i < num_vertices(testg); ++i) // size_t vertice number in the graph 
    { 
     std::cout << " v[" << i << "] ID: " << testg[i].id << ", Label: " << testg[i].label << std::endl; 
    } 
    // Edge list 
    std::cout << " Edge list: " << std::endl; 
    edge_pair ep; 
    for (ep = edges(testg); ep.first != ep.second; ++ep.first) // ep edge number 
    { 
     vertex_t from = source(*ep.first, testg); 
     vertex_t to = target(*ep.first, testg); 
     edge_t edg = edge(from, to, testg); 
     std::cout << " e[" << testg[from].id << "," << testg[to].id << "] ID: " << testg[edg.first].id 
        << " , Label: " << testg[edg.first].label << std::endl; 
    } 
    std::cout << std::endl; 

    std::cout << "TIME: " << (std::clock() - start)/(double)CLOCKS_PER_SEC << "s" << std::endl; // fin du programme. 
} 

打印

INPUT 
Graph contains 2 vertices, and 1 edges 
    Vertex list: 
    v[0] ID: 0, Label: 0 
    v[1] ID: 1, Label: 3 
    Edge list: 
    e[0,1] ID: 10 , Label: 10 

TIME: 0s