2010-05-21 173 views
0

任何人都可以給我一個C代碼來查找兩個節點之間的所有可能路徑嗎? 例如。 如果圖具有以下邊緣 1-2 1-3 2-3 2-4 3-4查找無向圖中兩個節點之間的所有可能路徑

1和4之間的所有路徑是:

1-2-3-4

1-2-4

1-3-4

1-3-2-4

+0

Duplicate:http://stackoverflow.com/questions/713508/find-the-paths-between-two-given-nodes – Donnie 2010-05-21 02:26:33

回答

3

深度優先搜索執行此任務。

+0

不是。 DFS可能會給你一些路徑,但不是全部。 – 2010-05-21 02:14:17

+0

@凱蒂。想想一下d皇后問題的解決方案。 – 2010-05-21 02:37:37

+0

我認爲你正在考慮的解決方案(循環遍歷所有可能的方塊,如果可能的話放置一個皇后,並遞歸)不是DFS。 – 2010-05-21 02:55:06

0

(我假設你不想在你的路徑重複節點 - 否則可能路徑的數量是無限的。)

你可以做一個放鬆:

while (there is a change) { 
    for (v in nodes(G)) { 
    for (e in edges(v)) { 
     paths_to[v] = paths_to[v] union ((paths_to[e.to] not containing v) append v) 
    } 
    } 
} 

結果可以仍然是輸入圖的大小的指數。獲取所有路徑可能不是你想要做的。

0

這是一個簡單的問題算法。這不是一個最佳算法。

static struct { 
    int value1; 
    int value2; 
    int used; 
} data[] = { 
    { 1, 2 }, 
    { 1, 3 }, 
    { 2, 3 }, 
    { 2, 4 }, 
    { 3, 4 }, 
}; 

enum { DATA_SIZE = sizeof data/sizeof *data }; 

static int output[DATA_SIZE]; 

int traverse(int from, int to, int depth) { 
    output[depth++] = from; 

    int i; 
    if (from == to) { 
    for (i = 0; i < depth; i++) { 
     if (i) { 
     printf("-"); 
     } 
     printf("%d", output[i]); 
    } 
    printf("\n"); 
    } else { 
    for (i = 0; i < DATA_SIZE; i++) { 
     if (!data[i].used) { 
     data[i].used = 1; 

     if (from == data[i].value1) { 
      traverse(data[i].value2, to, depth); 
     } else if (from == data[i].value2) { 
      traverse(data[i].value1, to, depth); 
     } 

     data[i].used = 0; 
     } 
    } 
    } 
} 

int main() { 
    traverse(1, 4, 0); 
} 
+0

嗨bkail, 感謝您的程序。但是我在檢查以下節點時發現一些困難,太多的週期即將到來。 可以嘗試下面的邊緣和具有1與4之間 沒有重複的節點找到路徑{0,5},{1,4},{0,2}, {5,4} ,{1,2},{4,3},{3,10},{1,6},{6,2},{2,3},{2,7},{3,14},{ 6,7},{7,8},{8,10},{8,9},{8,12},{8,14},{5,11},{10,11},{ 13},{10,9},{11,14},{11,12},{12,13},{13,14}, – manoj 2010-06-02 09:02:20

0

遞歸方法:

findPaths(path = startNode, goal) 
    paths = [] 
    if the last node in path is goal: 
     return path 
    for each node n connected to the last node in path: 
     if n is not already on the path: 
      paths.append(findPaths(path.append(node), goal)) 
    return paths //may still be [] 
0

這是爲時已晚,而不是C代碼,但是可以幫助別人。這個算法展示了我如何在java中實現它。

findPath(start) 
    Childs = getDirectChildsOf(start) 
    foreach child in Childs 
     tempRoute; 
     tempRoute.add(start) 
     if (child == end) 
      return tempRoute.add(child) 
     else 
      tempRoute.add(findPath(child)) 
      if (tempRoute.last() == end) 
       return tempRoute; 

這裏tempRoute可能是一個Route類,維持節點列表。能夠添加單個node和其他routetempRoute。 它也沒有找到所有可能的路徑。爲此你必須爲每個節點維護一個訪問標誌。

相關問題