資料結構大作業 並查集 檢查網路

2021-06-29 07:05:30 字數 1790 閱讀 6392

11、並查集:檢查網路

問題描述】

給定乙個計算機網路以及機器間的雙向連線列表,每一條連線允許兩端的計算機進行直接的檔案傳輸,其他計算機間若存在一條連通路徑,也可以進行間接的檔案傳輸。請寫出程式判斷:任意指定兩台計算機,它們之間是否可以進行檔案傳輸?

【輸入要求】

輸入若干測試資料組成。對於每一組測試,第1行包含乙個整數n(≤10000),即網路中計算機的總台數,因而每台計算機可用1到n之間的乙個正整數表示。接下來的幾行輸入格式為i c1 c2或者 c或者c c1c2或者s,其中c1和c2是兩台計算機的序號,i表示在c1和c2間輸入一條連線,c表示檢查c1和c2間是否可以傳輸檔案,s表示該組測試結束。當n為0時,表示全部測試結束,不要對該資料做任何處理。

【輸出要求】

對每一組c開頭的測試,檢查c1和c2間是否可以傳輸檔案,若可以,則在一行中輸出「yes」,否則輸出「no」。當讀到s時,檢查整個網路。若網路中任意兩機器間都可以傳輸檔案,則在一行中輸出「the network is connected.」,否則輸出「there are kcomponents.」,其中k是網路中連通集的個數。兩組測試資料之間請輸出一空行分隔。

最簡單的資料結構作業了,就是一道acm題,也不用什麼亂七八糟的話,僅僅百行以內的**就搞定。

跟題目乙個樣子就是一道並查集的問題:

把兩種典型的並查集問題聯絡到了一起:1、查詢兩個是否是連通的。2、看總共有幾個連通區,跟暢通工程是一樣的問題。

再注意一些細節的輸入輸出的處理即可:

自己還編了一組測試資料,進行測試:

還有用了路徑壓縮的優化方法

#include #include using namespace std;

#define maxn 10002///n(≤10000)

int set[maxn];///設定運算元組

int rank[maxn];///按秩壓縮的秩數

void init(int n)

}int find(int x)///帶路徑壓縮的向上查詢

void union_set(int a,int b)///合併,當執行i操作即把兩台電腦連線在一起的時候,將父節點設在一起即可

int main()

if(c=='i')///i操作表示將兩台電腦,連線在一起

if(c=='s')///s操作,查詢整個網路連通情況。並且表示該組資料全部結束

if(tmp==1)///只有乙個連通區的時候,表示全部連線

printf("the network is connected.\n");

else///否則要輸出有多少個並且輸出個數

printf("there are %d components.\n",tmp);

break;}}

}return 0;

}/**測試資料

輸入:5

i c1 c2

i c2 c3

c c1 c3

c c2 c4s10

i c3 c4

i c4 c5

i c6 c7

i c8 c9

i c7 c9

c c6 c8

c c3 c5

c c1 c10s3

i c1 c2

i c2 c3s0

輸出yes

nothere are 3 components.

yesyes

nothere are 5 components.

the network is connected.

**/

檢查網路 並查集

題目要求 給定乙個計算機網路以及機器的雙向連線列表,每一條連線允許兩端的計算機進行直接的檔案傳輸,其他計算機間若存在一條連通路徑,也可以進行間接的檔案傳輸,請寫程式判斷,任意指定兩台計算機,它們之間是否可以進行檔案傳輸?輸入要求 輸入由若干組測試資料組成。對於每一組測試資料,第1行包含乙個整數n 1...

並查集 檢查網路

問題描述 給定乙個計算機網路以及機器間的雙向連線列表,每一條連線允許兩端的計算機進行直接的檔案傳輸,其他計算機間若存在一條連通路徑,也可以進行間接的檔案傳輸。請寫出程式判斷 任意指定兩台計算機,它們之間是否可以進行檔案傳輸?輸入要求 輸入若干測試資料組成。對於每一組測試,第1行包含乙個整數n 100...

資料結構 並查集

並查集,顧名思義,合併 查詢 集合 並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。對於概念等等的這裡不再贅述,直接講解應用。應用1 判斷圖中有多少聯通分量 或者圖是否聯通 聯通分量 1 hdu 1213 應用2 判斷圖是否...