簡體   English   中英

無向圖,檢查節點之間是否存在路徑

[英]Undirected graph, check if path exists between nodes

我正在嘗試檢查從一個頂點到其他多個頂點之間是否存在路徑(在我的特殊情況下,我需要檢查是否有從牆頂到地面上任何其他磚塊的路徑,並且每一個磚是一個頂點)

我已經找到了一些算法,但是我需要簡化版本只是為了檢查路徑是否存在。 (如果我也可以有許多可能的路徑,那就太好了。)

我是新手,在詢問之前,已經搜索了很多關於這些搜索算法的內容,但是我不知道如何在我的情況下實現它們。

編輯1:我忘了補充一點,我可以擁有數百個積木(頂點),並且需要最快的方法來檢查路徑是否存在。 我搜索了Dijkstra的算法,它看起來太復雜了。 由於某種原因,有向圖有更多的教程和解釋,所以這就是我在這里寫問題的原因。

現在我有頂點類:

public class Vertex : MonoBehaviour {

public string id;

public float x; // Horizontal coord
public float y; // Vertical coord

public Vertex(string id, float x, float y)
{
    this.id = id;
    this.x = x;
    this.y = y;
}
}

和邊緣類:

public class Edge : MonoBehaviour {

public Vertex Vertex1; // Vertex one
public Vertex Vertex2; // Vertex two

public Edge(Vertex Vertex1, Vertex Vertex2)
{
    this.Vertex1 = Vertex1;
    this.Vertex2 = Vertex2;
}
}

真的不知道如何用圖形表示它們 ,因為作為輸入,我有3維牆,並且在銷毀一些磚塊之后,我需要檢查頂部磚塊是否具有通向地板上任何底部磚塊的路徑,因為如果沒有,則基本上不會形成壁壘坍方。 所以看起來我必須檢查所有路徑的3維。

編輯2:

在頂點類中,我添加了鄰居列表public List<Vertex> Neighbours; 但仍然不知道如何在3d中表示圖形,因此至少您可以告訴我如何在2d中表示圖形。

ps(謝謝大家的評論和回答,我非常感謝他們)。

借助一些預處理,您可以在幾乎恆定的時間內回答這些查詢,這在您必須測試幾對節點時很有用(似乎確實如此)。

預處理很簡單:用V個項初始化一個不相交集(V是頂點數),然后對每個邊(x,y)調用union(x, y) 這在邊沿數量上幾乎是線性的(“幾乎”是指它的逆阿克曼因子不同,該因子非常接近常數,因此實際上也可能是常數)。

要查找xy之間是否存在路徑,請測試find(x) == find(y)

通過將鄰接矩陣提高到第V次冪,可以找到任何一對之間的可能路徑數(使用任何快速指數算法,但它仍然相對較慢)。

很簡單

  1. 將源頂點放入隊列
  2. 檢查隊列是否為空,是否完成,否則,無路徑
  3. 檢查它是否是目標集中的頂點之一,如果是,則完成,路徑存在,如果不存在,則將該頂點的所有鄰居放入隊列中,重復陡峭2

要查找任何路徑,可以使用深度優先搜索。 要找到最短路徑,可以使用廣度優先搜索。 要查找所有路徑(因此有路徑數),可以使用以上兩種方法之一,並修改為(a)在找到目標節點后繼續,並且(b)查看其他路徑是否可以到達目標節點(盡管可能已經到達)達到之前)。 要查找到節點的權重最小的路徑(在加權圖中),可以使用Dijkstra算法(無負邊),Bellman-Ford(負邊可以)或Floyd-Warshall(無負循環)。

您只想測試路徑是否存在,因此從圖論的角度來看,最好的選擇是使用BFS。

你有一個源頂點src和目標頂點的集合S TGT。

由於在BFS結束時圖形是無向的,因此您將擁有包含src的已連接組件的一組頂點。 只需檢查S tgt是否是該集合的子集即可。

總結一下:

  1. S bfs為頂點的空哈希集
  2. src開始執行BFS:
    1. 發現頂點v時 ,將其插入S bfs
  3. 執行S bfsS tgt的交集,以從src獲取所有目標頂點

由於您正在尋找一種簡單的解決方案,因此我將使用廣度優先搜索。 一個不太簡單的解決方案將涉及諸如All-Pairs最短路徑算法之類的問題,以確定在圖中每對節點之間的最短路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM