并(zhao)查(die)集详解以及其优化版本
眾所周知,并查集是用來查看兩個人是不是有關系的。舉個例子,奧特曼的故事。首先奧特曼有平成時期的奧特曼還有昭和時期的奧特曼,平成時期的奧特曼有迪迦奧特曼 戴拿奧特曼 蓋亞奧特曼 高斯 阿古茹 高斯 雷杰多 夢比優斯等? ??昭和奧特曼有 初代 賽文 泰羅 艾斯 杰克 雷歐 奧特之王等? 小吳非常喜歡奧特曼,所以想要了解一下,現在有一個難題那就是,給你兩個奧特曼,如何去判斷這兩個奧特曼是不是一個時期的呢。于是小吳就去找她帥氣又聰明的男朋友小鮑幫忙,小鮑就給她想到了一個方法,那就是用并查集去解決這個事情。并查(找爹)集 就是用來解決這種問題的。在并查集中 我們給每一個數字都存儲了自己的爹地的代號,通過自己的爹地的代號網上找 可以找到爹地的爹地的代號,最后可以找到祖先的代號。如果兩個角色的祖先代號相同,那么恭喜你,兩個奧特曼是屬于一個時代的,如果祖先不是一個代號 那么他們就不是一個時代的。下面就給大家附上找爹地的代碼以及初始化爹地的代碼
int findfather(int x){ //找爹的代碼if(father[x]==x)return x;return findfather(father[x]); } void init() //剛開始每個人都是自己的爹,然后根據輸入去判斷爹。 {for(i=0;i<n;i++)father[i]=i; }有一天,M78星云出現問題,昭和時期和平成時期合并了,他們都變成了遠古奧特曼,那么怎么才能把他們變成一個時期的奧特曼呢?聰明的小鮑又想起了 并查集可以并也可以查,就運用并的操作把他們合在一起了,那怎么才能合并呢,那可太簡單了,只需要把一個時期的奧特曼的祖先節點指向另一個時期的祖先節點。因為我們有記錄爹地的數組,只需要把一個時期的祖先變成另一個時期祖先的兒子就可以了 下附代碼:
void merge(int a,int b){if(a!=b)father[a]=b; //該地方可以進行優化 elsecout << "same father" << endl;//兩個祖先一樣 不用合并 }通過這一系列操作 奧特曼就成為了一個大家庭了?
注:后序會更新并查集的優化代碼以及優化思路。
總結
以上是生活随笔為你收集整理的并(zhao)查(die)集详解以及其优化版本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: http://c1zhao.iteye.
- 下一篇: allegro更新铜皮方法和快捷键