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