我实现了一个图结构(对于具有大约30,000个节点和大约300,000条边的图)如下:
class graph;
class node;
class edge;
class graph
{
public:
graph(){};
vector nodeS;
vector edgeS;
};
class node
{
public:
node(){};
vector my_edgeS;
double weight;
};
class edge
{
public:
edge(){};
node *start, *end;
double weight;
};
在nodeS
存储节点的情况下,edgeS
包含边缘,start
和end
分别指向特定边缘的起始节点和结束节点,权重是节点(边缘)权重,my_edgeS
由与给定节点相关的边缘组成。
我想得到许多由它的一些边定义的原图的子图(边的偶数不变,原始图的所有节点都包含在子图中)。如何以最有效的方式在my_edgeS
中构建和存储这些子图(特别是它们的C++向量)?还是有其他更适合于从图中导出子图的结构?
发布于 2019-03-27 02:45:53
我建议将my_edgeS
数据成员从node
中删除。将其替换为graph
中的一个方法D3
。这样,一个子图中就包含了指向同一个node
s的一些指针,以及它们对应的edge
s。
我强烈建议你不要使用原始指针。
作为素描
struct node
{
double data;
};
using node_ptr = std::shared_ptr;
struct edge
{
node_ptr start, end;
double weight;
};
using edge_ptr = std::shared_ptr;
struct graph
{
vector nodes;
vector edges;
std::vector edges_for(node_ptr n)
{
std::vector result;
std::copy_if(edges.begin(), edges.end(), [n](edge_ptr e) { return (e->start == n) || (e->end == n); });
return result;
}
std::vector in_edges_for(node_ptr n)
{
std::vector result;
std::copy_if(edges.begin(), edges.end(), [n](edge_ptr e) { return e->end == n; });
return result;
}
std::vector out_edges_for(node_ptr n)
{
std::vector result;
std::copy_if(edges.begin(), edges.end(), [n](edge_ptr e) { return e->start == n; });
return result;
}
graph subgraph(std::vector sub_nodes)
{
std::vector sub_edges;
for (node_ptr n : sub_nodes)
{
auto n_edges = in_edges_for(n);
sub_edges.insert(n_edges.begin(), n_edges.end());
}
return { sub_nodes, sub_edges };
}
graph subgraph(std::vector sub_edges)
{
std::unordered_set sub_nodes;
std::transform(sub_edges.begin(), sub_edges.end(), std::inserter(sub_nodes, sub_nodes.end()), [](edge_ptr e){ return e->start; });
return { { sub_nodes.begin(), sub_nodes.end() }, sub_edges };
}
};
https://softwareengineering.stackexchange.com/questions/389242
复制