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