【问题标题】:How do I convert a matrix into an unweighted graph or tree?如何将矩阵转换为未加权的图或树?
【发布时间】:2017-03-21 02:00:49
【问题描述】:

我有一个名为 array[][] 的矩阵,其宽度和高度尺寸相等。它包含的数据如下所示

        #1    #2     #3       #4     #5    #6        #7   #8
    #1   0    100    -1       10     -1    -1        -1   100
    #2  100     0    -1       -1     10    10        -1    -1
    #3  -1     -1     0     1000    100    -1      1000    -1 
    #4  50     -1   720       -1    -1     -1       -1     -1  
    #5  -1     10   100       -1      0    -1       100    -1
    #6  -1     10    -1       -1     -1     0        50  2000
    #7  -1     -1  1000       -1    100    10         0    -1
    #8  100    -1    -1       -1     -1  1000        -1     0

A -1 表示没有从#x 到#y 的路径,正数表示有。我正在尝试将其转换为图形或树,以便更容易实现最小跳数算法。有没有简单的转换方法?

【问题讨论】:

  • 当前是一个有效的图表。如果您不喜欢重量,请转换它们。如果你想要一个特定的数据结构,你应该在你的问题中提到它。
  • 您编写矩阵的方式称为 adjazenzmatrix,您可以将其转换为 adjazenzlist、nodelist 或 edgelist... )...在我看来,将其转换为对象更糟...因为跳转到其他未连接的节点很难管理...最小跃点算法 (bfs) 可以通过 adjazenzmatrix 或 adjazentlist 轻松实现。所以我不会更改数据集...
  • 已经是图表了。欲了解更多信息,geeksforgeeks.org/breadth-first-search-or-bfs-for-a-graph

标签: c++ matrix graph tree


【解决方案1】:

这很简单。矩阵中的所有数字都代表边。宽度/高度是顶点的数量。 假设您的图是一个向量或顶点和边的列表。那么下面的算法就可以了(伪代码):

int dimension;
int weights[dimension][dimension]; // input
vector<int> verticies;
vector<Edge> edges; // Edge is a struct with int from, to and weight
for( i = 0 ... dimension) {
    verticies.push_back(i+1);
}

for( row = 0 ... dimension) {
    for( col = 0 ... dimension) {
        weight = weights[row][col];
        if( weight > 0) {
            edges.push_back(Edge(col, row, weight));
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    相关资源
    最近更新 更多