【发布时间】: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
我在管理邻接矩阵和获取我需要的列时遇到了问题。基本上我想做的是
- 遍历图表
- 注意我们当前所在的节点包含在
oddVertices - 添加
oddVertices中包含的其他节点。
我不能使用除MyCustomVector之外的任何其他数据结构,它只有[]、size()、pop_back()和push_back()等基本功能。
【问题讨论】:
-
图中的节点数和边数是多少?
-
@arbitrary_A 我的图表只是处理从 {1, ..., n} 标记的节点。在这种情况下,n = 15。在某个 [i][j] 处的“1”表示节点 i 和 j 之间的共享边,否则为 INF。
标签: c++ matrix graph-theory