簡體   English   中英

根據給定的邊集確定樹的算法

[英]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沒有循環的邊。

因此,您需要檢查的第一件事是給定的EV滿足E = V - 1 如果它們不只是返回false,那么您可以開始檢查是否存在循環。

如前所述,至少有兩種方法:執行簡單的深度優先搜索(DFS)或使用聯合查找集

DFS方法:這個想法很簡單:當我們在做DFS並遇到后邊緣時,發現了一個循環。 請查看本文,以獲取有關圖上循環檢測的更多詳細信息。

這種方法的時間復雜度是DFS的復雜度,即O(V + E)

聯合查找數據結構方法:首先,您需要知道什么是聯合查找數據結構

它是一種數據結構,可跟蹤被划分為多個不相交(不重疊)子集的元素集。 它支持...特定元素位於哪個子集中。

至於實現,我們最初將所有頂點視為不同的子集。 對於每個邊緣,我們檢查兩個端點是否在同一組中。 如果它們已經在同一集合中,則我們檢測到一個周期; 如果沒有,我們將他們一起加入。

檢查這篇文章有關如何使用聯盟查找數據結構來檢測周期。

假定可將逆阿克曼函數視為一個小的常數(小於5) ,則此方法的時間復雜度約為O(E)

暫無
暫無

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

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