【问题标题】:Extracting the edges of odd degree vertices in a graph提取图中奇数度顶点的边
【发布时间】:2021-12-01 05:39:20
【问题描述】:

我有一个如下图,用邻接矩阵MyCustomVector<MyCustomVector<int>> graph表示:

0       1       2       3       4       5       6       7       8       9       10      11      12      13      14      15

1       0       1       1       INF     INF     INF     INF     INF     INF     INF     INF     INF     INF     INF     INF
2       1       0       1       1       1       INF     INF     INF     INF     INF     INF     INF     INF     INF     INF
3       1       1       0       INF     INF     1       INF     INF     INF     INF     INF     INF     INF     INF     INF
4       INF     1       INF     0       1       INF     INF     INF     1       INF     INF     INF     INF     INF     INF
5       INF     1       INF     1       0       1       INF     INF     INF     1       1       INF     INF     INF     INF
6       INF     INF     1       INF     1       0       1       INF     1       1       INF     1       INF     INF     INF
7       INF     INF     INF     INF     INF     1       0       1       INF     INF     INF     INF     1       1       1
8       INF     INF     INF     INF     INF     INF     1       0       INF     INF     INF     INF     INF     INF     1
9       INF     INF     INF     1       INF     1       INF     INF     0       INF     INF     INF     INF     INF     INF
10      INF     INF     INF     INF     1       1       INF     INF     INF     0       INF     INF     INF     INF     INF
11      INF     INF     INF     INF     1       INF     INF     INF     INF     INF     0       1       INF     INF     INF
12      INF     INF     INF     INF     INF     1       INF     INF     INF     INF     1       0       INF     INF     INF
13      INF     INF     INF     INF     INF     INF     1       INF     INF     INF     INF     INF     0       1       INF
14      INF     INF     INF     INF     INF     INF     1       INF     INF     INF     INF     INF     1       0       1
15      INF     INF     INF     INF     INF     INF     1       1       INF     INF     INF     INF     INF     1       0

最左边和最上面的列和行只代表#节点。我认为它更容易看到。所有边都是无向的,并且权重为 1。 INF 表示节点 A 和节点 B 不共享一条奇异边。

我可以计算所有奇数度顶点,它们是{ 3 4 5 7 14 15 },它们包含在一个向量中,我拥有MyCustomVector<int> oddVertices。我想要做的是构建这个图的子图,只有这些顶点和它们的边,所以像这样。

0       3       4       5       7       14       15   
3       0       INF     INF     INF     INF      INF
4       INF     0       1       INF     INF      INF
5       INF     1       0       INF     INF      INF
7       INF     INF     INF     0       1        1  
14      INF     INF     INF     1       0        1                                             
15      INF     INF     INF     1       1        0

这样我就可以在这张图上运行 Floyd Warshall 算法并得到

0       3       4       5       7       14       15   
3       0       2       2       2       3        3
4       2       0       1       3       4        4
5       2       1       0       2       1        1
7       2       3       2       0       1        1  
14      3       4       3       1       0        1                                             
15      3       4       3       1       1        0

我在管理邻接矩阵和获取我需要的列时遇到了问题。基本上我想做的是

  1. 遍历图表
  2. 注意我们当前所在的节点包含在oddVertices
  3. 添加oddVertices中包含的其他节点。

我不能使用除MyCustomVector之外的任何其他数据结构,它只有[]size()pop_back()push_back()等基本功能。

【问题讨论】:

  • 图中的节点数和边数是多少?
  • @arbitrary_A 我的图表只是处理从 {1, ..., n} 标记的节点。在这种情况下,n = 15。在某个 [i][j] 处的“1”表示节点 i 和 j 之间的共享边,否则为 INF。

标签: c++ matrix graph-theory


【解决方案1】:

只需提取索引子集对应的行和列:

using std::vector;

/*
** input:
**   adjacency list                adj
**   subset of node indices        v
** output:
**   adj list of induced subgraph  subadj
*/
vector<vector<int>> get_subgraph(vector<vector<int>> const &adj, vector<int> const &v)
{
    vector<vector<int>> subadj(v.length(), vector<int>(v.length()));
    for (unsigned int i = 0; i < v.size(); ++i)
        for (unsigned int j = 0; j < v.size(); ++j)
        {
            subadj[i][j] = adj[v[i]][v[j]];
        }
    return subadj;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多