[英]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)
。 這在邊沿數量上幾乎是線性的(“幾乎”是指它的逆阿克曼因子不同,該因子非常接近常數,因此實際上也可能是常數)。
要查找x
和y
之間是否存在路徑,請測試find(x) == find(y)
。
通過將鄰接矩陣提高到第V次冪,可以找到任何一對之間的可能路徑數(使用任何快速指數算法,但它仍然相對較慢)。
很簡單
要查找任何路徑,可以使用深度優先搜索。 要找到最短路徑,可以使用廣度優先搜索。 要查找所有路徑(因此有路徑數),可以使用以上兩種方法之一,並修改為(a)在找到目標節點后繼續,並且(b)查看其他路徑是否可以到達目標節點(盡管可能已經到達)達到之前)。 要查找到節點的權重最小的路徑(在加權圖中),可以使用Dijkstra算法(無負邊),Bellman-Ford(負邊可以)或Floyd-Warshall(無負循環)。
您只想測試路徑是否存在,因此從圖論的角度來看,最好的選擇是使用BFS。
你有一個源頂點src和目標頂點的集合S TGT。
由於在BFS結束時圖形是無向的,因此您將擁有包含src的已連接組件的一組頂點。 只需檢查S tgt是否是該集合的子集即可。
總結一下:
由於您正在尋找一種簡單的解決方案,因此我將使用廣度優先搜索。 一個不太簡單的解決方案將涉及諸如All-Pairs最短路徑算法之類的問題,以確定在圖中每對節點之間的最短路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.