国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

【圖】【并查集】無所不在的宗教

2019-11-08 02:50:05
字體:
來源:轉載
供稿:網友

問題 B(1354): 無所不在的宗教

時間限制: 1 Sec  內存限制: 64 MB

題目描述

世界上許多不同的宗教,你很難把它們全都記住。你有興趣找出學生們到底信仰多少種不同的宗教。 已知學校共有N名學生(0 < N ≤ 50000),編號從1..N。你去詢問每一個學生的宗教信仰是不可行的,而且,很多學生不愿意透露自己的信仰。一種避免這個問題的方法是詢問M對學生(0 ≤ M ≤ N(N-1)/2)是否信仰同一種宗教。假定每個學生只信仰一種宗教,而且每個學生都要信仰一種宗教。

輸入

輸入包括若干個組數據,每組數據格式為: 第1行:2個空格分開的整數N和M 接下來M行,每行2個整數i和j,表示第i號學生與第j號學生信仰相同 輸入以2個空格分開的0結束

輸出

對每組輸入數據,輸出最多有幾種不同的宗教 輸出格式見樣例

樣例輸入

 (如果復制到控制臺無換行,可以先粘貼到文本編輯器,再復制)

10 91 21 31 41 51 61 71 81 91 1010 42 34 54 85 80 0

樣例輸出

Case 1: 1Case 2: 7

提示

數據量巨大,C++程序推薦用 scanf#----------------------------------------------------------------------------------------------#

寫這道題并不是想說什么思路,主要是想記錄一個驚天地泣鬼神的東西(這一點也不夸張……)

很多時候并查集需要找集合的個數(比如這道題),所以,我們應該怎么辦呢?

我的第一次方法是:

找每一個結點的根,用一個bool數組記錄,有一個新的就sum++:

for(int i=1;i<=n;i++)            if(!ans[father[i]])            {                ans[father[i]]=1;                sum++;            }于是就有了嚴重的錯誤(還很耗時……對于這種在其他OJ上5秒限制而這里1秒限制來說就更惡心得要死了)……

所以,我發現了一個方法(盡管很容易想到,然而我沒有):

直接數根結點個數!

我一下子就覺悟了……

反正我的根結點標記是-1,就這樣即可:

for(int i=1;i<=n;i++)			if(father[i]==-1)				sum++;我用了路徑壓縮,所以不用再找root。

代碼:

#include<cstdio>#include<cstring>int father[50005];int n,m,k;int root(int x){	if(father[x]==-1)		return x;//找到根	father[x]=root(father[x]);//找的時候路徑壓縮,路徑壓縮是什么?簡單說就是使一個集合的除根結點以外所有點的father都變為根結點	return father[x];}int main(){	while(1)	{		scanf("%d%d",&n,&m);		if(!n&&!m) return 0;		memset(father,-1,sizeof(father));//默認每個數都是根結點		for(int i=1;i<=m;i++)		{			int x,y;			scanf("%d%d",&x,&y);			int rx=root(x),ry=root(y);			if(rx!=ry)//兩個數不在一個集合				father[ry]=rx;//就合并		}		int sum=0;		for(int i=1;i<=n;i++)			if(father[i]==-1)				sum++;//剛剛說的方法		PRintf("Case %d: %d/n",++k,sum);	}}                                                                                                                                        By WZY

#----------------------------------------------------------------------------------------------#
上一篇:STL 隊列queue的使用

下一篇:Game!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东港市| 潞西市| 黎川县| 长沙市| 东城区| 醴陵市| 罗城| 安溪县| 抚宁县| 正镶白旗| 永和县| 广丰县| 广丰县| 灵丘县| 桃园县| 津南区| 香河县| 奇台县| 永平县| 安达市| 凤山市| 南宁市| 桦川县| 大埔区| 安化县| 滦平县| 南陵县| 绥阳县| 临汾市| 花垣县| 永德县| 花莲县| 淮阳县| 嘉定区| 剑川县| 德州市| 凤翔县| 京山县| 双城市| 桃江县| 定兴县|