dengdengoj 1118找出民族

2021-09-12 07:57:10 字數 1025 閱讀 4925

世界上有許多不同的民族,現在有乙個比較感興趣的話題:在你的周圍人群中找出不同民族的種類數。假設你的周圍有n個人(0 < n < 10000),若直接問每乙個人什麼民族不大合適,許多人還不太願意說出自己的民族。有一種方法可以迴避這個問題:詢問其中的m對人,問他們是否屬於同乙個民族。通過這個資料,你可能不知道每個人具體的民族,但是你可以知道大概有多少個民族,假設每個人只屬於乙個民族。

輸入多組測試資料,每組資料的開頭有兩個數:n和m,佔一行,人的編號從1開始到n,接下來有m行,每行有兩個數i和j,代表編號為i和j的兩個人同屬於乙個民族。每行兩個數之間有乙個空格,當輸入n=0、m=0時,表示整個輸入提前截止。

每組輸出佔一行,僅有乙個數即不同的民族數。

10 4

2 34 5

4 85 8

10 9

1 21 3

1 41 5

1 61 7

1 81 9

1 10

7

1

此問題是並查集(圖論)問題,在看到王道考研機試指南書上的一道題後,發現原理是一樣的,所以直接就把**搬上去就實現了。題面上描述的是乙個實際問題,但是很容易把實際問題提取出來轉化為在乙個圖上查詢連通分量的個數問題。使用並查集即可完成,初始時,每個節點都是孤立的連通分量(即每個人都是乙個民族),當讀入兩個節點之間有邊時(即兩個人是同乙個民族時),就將他們所在的集合合併(表示這兩個民族的人是同乙個民族),對所有的邊重複此操作,最後計算所有的節點被儲存在幾個集合中(即有幾個民族)。

**如下:

#include

using namespace std;

#define max 10000

int tree[max];

int findroot(int x)

}//查詢根節點 

int main()

while(m--)

}int ans=0;

for(int i=1;i<=n;i++)

printf("%d\n",ans);

}return 0;

}

11 1 執行緒簡介

我們已經中討論了程序,我們學習了unix程序的環境,程序間的關係,控制程序的方法,程序間的關係 同時我們也看到程序間共享的資源時非常少的。在本章中,我們將學習如何使用多執行緒控制來實現單個程序環境內執行多個執行緒,所有單個程序內的執行緒都有許可權訪問相同的程序元件,比如說檔案描述符以及記憶體。任何是...

11 1使用關聯容器

map是stl的乙個容器,和set一樣,map也是一種關聯式容器。它提供一對一 其中第乙個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值 的資料處理能力,由於這個特性,有助於我們處理一對一資料。map內部是自建一顆紅黑樹 一種非嚴格意義上的平衡二叉樹 這顆樹具有對資料自...

1 11 輸入輸出

程式執行期間,從外設接收資訊的操作稱為 輸入 向外設傳送資訊的操作稱為 輸出 本節介紹從鍵盤向程式中的變數輸入資料以及將程式計算的結果輸出到顯示器上的基本操作。c 中沒有專門的輸入輸出語句,而是通過系統提供的輸入輸出流類來實現。cin和cout的書寫形式很靈活,如果有多個變數,即使型別不相同,也可以...