邻接矩阵表示任意树中节点之间的连接。
这是一个邻接矩阵的实例,它提供了一个无向图:
1 2 3 4 1 0 1 1 0 2 1 0 1 0 3 1 1 0 0 4 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语言样本)
答案 0 :(得分:3)
考虑到你的例子的限制,代码不需要超过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
我猜这就是你要找的东西。
答案 1 :(得分:2)
看起来你正在使用无向图,你可能想要一个非循环路径。
您最简单的选择是在图表上进行广度优先或深度优先。我要做的是写一个像这样的递归方法(深度优先):
public void recurse(int node) {
System.out.print("-> " + node);
for (int i = node; i < num_nodes; ++i) {
if (i == node)
continue;
if (graph[node][i] > 0)
recurse(i);
}
}
然后您只需遍历节点并在每个起始节点上调用recurse(node)
。我希望有所帮助。