POJ 1611 The Suspects (并查集)
生活随笔
收集整理的這篇文章主要介紹了
POJ 1611 The Suspects (并查集)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章作者:ktyanny?文章來源:ktyanny?轉載請注明,謝謝合作。?
ktyanny:a的第一道并查集。
題目描述:
有很多組學生,在同一個組的學生經常會接觸,也會有新的同學的加入。但是SARS是很容易傳染的,只要在改組有一位同學感染SARS,那么該組的所有同學都被認為得了SARS。現在的任務是計算出有多少位學生感染SARS了。假定編號為0的同學是得了SARS的。
解題思路---->顯然并查集了。并查集的詳細解釋在可以點擊?并查集(不相交集合)進行學習。采用num[]存儲該集合中元素個數,并在集合合并時更新num[]即可。然后找出0所在的集合的根節點x,因此,num[x]就是answer了。
?
ac代碼: 16MS C++
?
#include?<stdio.h>//by ktyanny#include?<iostream>
using?namespace?std;
const?int?MAXN?=?30001;?/*結點數目上線*/
int?pa[MAXN];????/*p[x]表示x的父節點*/
int?rank[MAXN];????/*rank[x]是x的高度的一個上界*/
int?num[MAXN];/*num[]存儲該集合中元素個數,并在集合合并時更新num[]即可*/
void?make_set(int?x)
{/*創建一個單元集*/
????pa[x]?=?x;
????rank[x]?=?0;
????num[x]?=?1;
}
int?find_set(int?x)
{/*帶路徑壓縮的查找*/
????/*保存待查找的數*/
????int?r?=?x,?temp;
????/*找到根節點*/
????while(pa[r]?!=?r)?r?=?pa[r];
????while(x?!=?r)
????{
????????temp?=?pa[x];
????????pa[x]?=?r;
????????x?=?temp;
????}
????return?x;
????//if(x?!=?pa[x]) //注釋掉的其實也是可以的,不過不想用遞歸來做啦
????//????pa[x]?=?find_set(pa[x]);
????//return?pa[x];
}
/*按秩合并x,y所在的集合*/
void?union_set(int?x,?int?y)
{
????x?=?find_set(x);
????y?=?find_set(y);
????if(x?==?y)return?;
????if(rank[x]?>?rank[y])/*讓rank比較高的作為父結點*/
????{
????????pa[y]?=?x;
????????num[x]?+=?num[y];
????}
????else?
????{
????????pa[x]?=?y;
????????if(rank[x]?==?rank[y])
????????????rank[y]++;
????????num[y]?+=?num[x];
????}
}
//answer?to?1611?
int?main()
{
????int?n,?m,?x,?y,?i,?t,?j;
????while(scanf("%d%d",?&n,?&m))
????{
????????if(m==n?&&?n?==?0)?break;
????????if(m?==?0)
????????{
????????????cout?<<?"1\n";?continue;
????????}
????????for(i?=?0;?i?<?n;?i++)
????????????make_set(i);
????????for(i?=?0;?i?<?m;?i++)
????????{
????????????scanf("%d",?&t);
????????????scanf("%d",?&x);
????????????for(j?=?1;?j?<?t;?j++){
????????????????scanf("%d",?&y);
????????????????union_set(x,?y);
????????????????x?=?y;
????????????}
????????}
????????x?=?find_set(0);/*找到0所在的樹的樹根*/
????????//int?ans?=?0;
????????//for(i?=?0;?i?<?n;?i++)
????????//????if(pa[i]?==?x)
????????//????????ans++;
????????//cout?<<?ans?<<?endl;
????????cout?<<?num[x]?<<?endl;
????}
????return?0;
}
?
?測試數據:
100 4 2 1 2 5 10 13 11 12 14 2 0 1 2 99 2 200 2 1 5 5 1 2 3 4 5 1 0?0 0?轉載于:https://www.cnblogs.com/ktyanny/archive/2009/12/09/1620304.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的POJ 1611 The Suspects (并查集)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让我安静的写会儿代码
- 下一篇: 【疑】poj 2773 Happy 20