如何有效地将给定图表减少并表示为等价形式?

时间:2017-09-02 19:14:18

标签: c++ graph stl

我正在使用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;
}

但我发现很难为下面的场景存储图表:

enter image description here

在上图中,我有两种类型的边ab。与边b 相邻的顶点被视为等效。因此,这两个顶点(在这种情况下为2&amp; 6)是等效的,它们必须合并并表示为一个顶点。

因此,我想减少并存储上图,如下所示:

enter image description here

注意:可能会发生这种情况,有时候减少它可能会侵犯某些财产。例如,如果边缘 1-6 2-6 都有标签b 1-2 则标签为{{ 1}}然后它变得暧昧,保持哪一个。那么,在这种情况下,我如何检测它并报告图表无效?

到目前为止,我正在考虑将aa标签边分开存储为两个向量数组,然后进行一种交叉检查。但这似乎是非常复杂的代码和非常混乱,可能会增加代码的整体复杂性。

1 个答案:

答案 0 :(得分:0)

由于您希望边缘具有与其连接的两个顶点的更多信息,因此您可以将边缘定义为:

enum edge_type {a, b};
struct edge {
  int v1;
  int v2;
  edge_type etype;
}

然后代表您的图表:

vector<edge> graph[NODES];