[英]How to traverse through a adjacency matrix?
鄰接矩陣表示任意樹中的節點之間的連接。
這是一個鄰接矩陣的實例,它提供了一個無向圖:
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語言樣本)
鑒於您的示例的限制,代碼不需要超過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
我猜這就是你要找的東西。
看起來好像你正在使用無向圖,你可能想要一個非循環路徑。
您擁有的兩個最簡單的選項是在圖表上進行廣度優先或深度優先。 我要做的是編寫一個遞歸方法(深度優先),如下所示:
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)
。 我希望有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.