回答
你想要做的是刪除所有Bridges(即刪除時斷開組件的邊緣)。維基百科的文章給出了一個線性時間算法來尋找所有的橋樑。
一旦所有的網橋都消失了,每個節點都是孤立的(具有度0)或者是週期的一部分。扔掉孤獨的節點,剩下的就是你想要的節點。
@DavidRicherby現在已經修復。 –
使用DFS(深度優先搜索),您可以在O(| V | + | E |)時間執行操作。在實現DFS時,只要保持你父節點跟蹤的verten的記錄,只要你找到了和父節點相同的父節點(意思是循環的完成),你可以聲明所有從那個父節點到最後一個孩子的節點作爲一些簡單循環的一部分。
以下評論如果您需要更多解釋。
這不是一個**簡單循環**,這僅僅是一個**循環**。簡單的循環不應包含任何其他循環。 –
這是我想到的算法,但我認爲如果很長時間我找到一個已經訪問過的頂點跟蹤它的所有前輩,我可以| V |圓圈(圓圈的一部分,屬於圓圈的一部分))和每一個O(| V |)時間爲此回溯。這與O(| V |(| V | + | E |))相加 – Amnon
我喜歡Bhavya的回答:但是如果我詳細說明它會有所幫助。
通常情況下,如果你做DFS你有一個訪問過的數組,保存訪問/未訪問狀態。
現在有
int visited[N];//N is the number of nodes/vertices in graph
讓
visited[i] =-1 if i-th vertex is not yet visited
visited[i] = 0 if i-th vertex is being processed
visited[i] = 1 if processing of i-th vertex is done
這樣,如果你遇到一個頂點一起參觀值0 DFS,它意味着你有一個cycle.To找到關於週期的頂點,使用前置數組將前一個頂點存儲在路徑中。
好吧,我想我有答案。 在處理DFS時,對於每個頂點v計算低(v)(下面解釋)。然後再次運行DFS和檢查每一個頂點v:
如果低(V)= d(V)(其中d(五)從DFS樹根的距離)
!頂點v是簡單循環的一部分。
*低(V)=分鐘(d(V),d(U),低(W)),其中(V,U)是後邊緣且w爲v的在一個子DFS樹。以O(| V | + | E |)時間計算。
- 1. 查找具有循環圖的兩點之間的所有簡單路徑
- 2. 對於foreach循環的簡單分頁
- 3. 查找具有相同邊緣屬性的所有頂點
- 4. 在有向圖中找出一個循環中的所有頂點
- 5. 一組頂點不交疊循環,以便每個頂點屬於一個循環
- 6. 分頁一個簡單的循環
- 7. 泰坦警告:查詢需要循環訪問所有頂點
- 8. 使用igraph查找連接到頂點的所有頂點?
- 9. Gremlin-Traversing查找與特定頂點無關的所有頂點
- 10. 如何在有向圖中找到包含某個頂點的所有循環?
- 11. 簡單循環查詢
- 12. OrientDB:查找所有沒有給定類的直接鄰居頂點的頂點
- 13. 在給定源頂點的情況下查找具有有向圖中的循環的所有路徑
- 14. 查找節點之間所有簡單路徑的問題?
- 15. 刪除for循環頂部行的所有語句
- 16. 查找樹中兩個頂點之間的簡單路徑(無向簡單圖)
- 17. 檢查給定頂點是否來自無向圖屬於一個循環,最有效的方式
- 18. 對於圖中的每個頂點,找出距離內的所有頂點d
- 19. 查找兩個頂點(節點)之間的所有路徑
- 20. 查找所有單線循環和如果並添加括號
- 21. 將文本框分組在一起,以便可以用簡單的循環更改所有屬性
- 22. 查找有循環的有向圖中的所有路徑
- 23. 簡單的JavaScript循環查詢
- 24. VBS循環簡單的查詢
- 25. 使用獨特屬性查找頂點
- 26. 查找頂部所示視圖UIActionSheet
- 27. 在一個簡單的Prolog圖中找到一個循環
- 28. 圖 - 找到從所有其他頂點可到達的頂點
- 29. For循環回到頂部
- 30. 簡單的遊戲循環不循環?
可能[重複](http://cs.stackexchange.com/questions/7216/find-the-simple-cycles-in-a-directed-graph)? –
我不明白你到底在問什麼。你給了一個簡單的循環,並且必須找到它的頂點?這個週期是如何規定的?你是否給出了一個圖表,並且必須過濾掉某個週期內沒有的頂點? –
給定一個圖G =(V,E),找到一組頂點U,使得屬於U的每個頂點u都是一個簡單循環上的頂點 – Amnon