堆的应用--并查集解决“擒贼先擒王”问题(JAVA)
現在有10個強盜。
1號強盜與2號強盜是同伙。
3號強盜與4號強盜是同伙。
5號強盜與2號強盜是同伙。
4號強盜與6號強盜是同伙。
2號強盜與6號強盜是同伙。
8號強盜與7號強盜是同伙。
9號強盜與7號強盜是同伙。
1號強盜與6號強盜是同伙。
2號強盜與4號強盜是同伙。
另外,強盜同伙的同伙也是同伙。你能幫助警方查出有多少個獨立的犯罪團伙嗎?
Input:
10 9
1 2
3 4
5 2
4 6
2 6
8 7
9 7
1 6
第一行n m,n表示強盜的人數,m表示警方搜集到的m條線索。接下來的m行每一行有兩個數 a b。表示強盜a和強盜b是同伙。
Output:
3
并查集實際上是通過一個一維數組來實現,其本質是維護一個森林。起初,森林的每個點都是孤立的,這里可以將點理解為只有自身一個結點的樹,通過查找與合并,逐漸將這些樹合并為一顆大樹。其實合并的過程就是子節點并到父結點上的過程。 在每次判斷兩個結點是否已經在同一顆樹中的時候,也要注意必須求其根源,必須一直往上找到其祖先結點(樹的根節點)。
解題思路:
main() {
??1.初始化數組init()
??2.輸入“關系”,每次都合并merge()
??3.有幾個f[i] = i就有幾個獨立的樹
}
init() {
??f[i] = i
}
merge() {
??1.獲取兩個點的祖先結點
??2.如果相等,則遵循“靠左原則”
}
getf() {
??1.如果f[i] = i,說明正是祖先,直接返回
??2.否則f[v] = getf( f[v] ),壓縮路徑,返回
}
總結
以上是生活随笔為你收集整理的堆的应用--并查集解决“擒贼先擒王”问题(JAVA)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP常量:define和const的不
- 下一篇: Oracle创建、删除、备份表