我正在使用stl在c ++中使用(显然简单的)无向图表示法进行挣扎。通常,我会使用一个简单的向量数组存储图形,如下所示:
#include <iostream>
#include <vectors>
#define NODES 10
using namespace std;
int main(){
vector<pair<int, int>> graph[NODES];
int u,v, weight;
for(int i=0;i<10;i++){
cin>>u>>v>>weight;
graph[u].push_back(make_pair(v,weight));
graph[v].push_back(make_pair(u,weight));
}
return 0;
}
但我发现很难为下面的场景存储图表:
在上图中,我有两种类型的边a
和b
。与边b
相邻的顶点被视为等效。因此,这两个顶点(在这种情况下为2
&amp; 6
)是等效的,它们必须合并并表示为一个顶点。
因此,我想减少并存储上图,如下所示:
注意:可能会发生这种情况,有时候减少它可能会侵犯某些财产。例如,如果边缘 1-6 和 2-6 都有标签b
而 1-2 则标签为{{ 1}}然后它变得暧昧,保持哪一个。那么,在这种情况下,我如何检测它并报告图表无效?
到目前为止,我正在考虑将a
和a
标签边分开存储为两个向量数组,然后进行一种交叉检查。但这似乎是非常复杂的代码和非常混乱,可能会增加代码的整体复杂性。
答案 0 :(得分:0)
由于您希望边缘具有与其连接的两个顶点的更多信息,因此您可以将边缘定义为:
enum edge_type {a, b};
struct edge {
int v1;
int v2;
edge_type etype;
}
然后代表您的图表:
vector<edge> graph[NODES];