gpt4 book ai didi

algorithm - 如何遍历邻接矩阵?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:54 24 4
gpt4 key购买 nike

邻接矩阵表示任意树中节点之间的连接。

这是一个呈现无向图的邻接矩阵的实例:

  1 2 3 41 0 1 1 02 1 0 1 03 1 1 0 04 0 0 0 0

这个矩阵呈现了一个图,其中节点 1 和 2 相连,1 和 3 相连,2 和 3 相连。

如何使用这种矩阵暴力破解此类图中所有可能路径的组合?我的意思是只选择节点 1 是一个单独的组合。那么,比如说,1-2 是一个单独的组合。 1-2-3; 3-1-2。但是 1-2-3-1 是不可能的,因为会重复选择同一个节点。

那么如何使用这些规则来暴力破解所有组合呢?

我更喜欢 C#、C++ 或 Java 语言示例)

最佳答案

考虑到您示例的限制,代码不会超过 40 行。

本质上,您只是继续访问与您当前正在检查的节点相连的节点。一旦发现没有新的节点可以访问,就跟踪支持。

此外,您还需要一些方法来跟踪您前往当前节点的路径。在示例中,我只是将此信息放入堆栈,以免我遇到一些内存管理问题。

#include <stdio.h>

#define N_NODES 4
#define NAME_OFFSET 1

int edges[N_NODES][N_NODES] = {
{ 0, 1, 1, 0 },
{ 1, 0, 1, 0 },
{ 1, 1, 0, 0 },
{ 0, 0, 0, 0 }
};

int visited[N_NODES] = { 0, 0, 0, 0 };

struct Node {
int node;
struct Node *prev;
};

void visit(int node, struct Node *prev_node) {
struct Node n = { node, prev_node };
struct Node *p = &n;

do
printf("%d%s", p->node + NAME_OFFSET, (p->prev != NULL)? "->" : "\n");
while ((p = p->prev) != NULL);

visited[node]=1;
int i;
for (i = 0; i < N_NODES; ++i)
if ((visited[i] == 0) && (edges[node][i] == 1))
visit(i, &n);
visited[node] = 0;
}

int main (int argc, char *argv[]) {
int i;
for (i = 0; i < N_NODES; ++i) {
visit(i, NULL);
}
return 0;
}

产生:

1
2->1
3->2->1
3->1
2->3->1
2
1->2
3->1->2
3->2
1->3->2
3
1->3
2->1->3
2->3
1->2->3
4

我想这就是您要找的。

关于algorithm - 如何遍历邻接矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15652877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com