[英]Algorithm to determine a tree or not, from the set of edges given
我正在嘗試解決SPOJ上的“這是一棵樹”問題。
您將獲得一個無權,無向圖。 編寫程序以檢查它是否為樹形拓撲。 該圖最多可包含10,000個節點和20,000個邊。
我知道樹的屬性,但是我無法找出正確的數據結構/算法來檢測循環。 誰能給我一個關於最佳方法的提示。
我只需要一個方向,而不是代碼。
請提出一個基本的數據結構,而不是語言庫中提供的某些內置結構。
謝謝
檢測循環的最簡單方法是使用深度優先搜索。 它具有O(V + E)
時間復雜度,因此是最佳選擇,因為您至少需要O(V + E)
時間才能讀取圖形。
至少有2種方法,但是所有方法都基於1個基本思想: 具有N
節點的樹必須具有N - 1
沒有循環的邊。
因此,您需要檢查的第一件事是給定的E
和V
滿足E = V - 1
。 如果它們不只是返回false,那么您可以開始檢查是否存在循環。
如前所述,至少有兩種方法:執行簡單的深度優先搜索(DFS)或使用聯合查找集 。
DFS方法:這個想法很簡單:當我們在做DFS並遇到后邊緣時,發現了一個循環。 請查看本文,以獲取有關圖上循環檢測的更多詳細信息。
這種方法的時間復雜度是DFS
的復雜度,即O(V + E)
。
聯合查找數據結構方法:首先,您需要知道什么是聯合查找數據結構 。
它是一種數據結構,可跟蹤被划分為多個不相交(不重疊)子集的元素集。 它支持...特定元素位於哪個子集中。
至於實現,我們最初將所有頂點視為不同的子集。 對於每個邊緣,我們檢查兩個端點是否在同一組中。 如果它們已經在同一集合中,則我們檢測到一個周期; 如果沒有,我們將他們一起加入。
檢查這篇文章有關如何使用聯盟查找數據結構來檢測周期。
假定可將逆阿克曼函數視為一個小的常數(小於5) ,則此方法的時間復雜度約為O(E)
) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.