並查集 檢查網路

2022-06-28 08:00:13 字數 1895 閱讀 2962

【問題描述】

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

【輸入要求】

輸入若干測試資料組成。對於每一組測試,第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 k components.」,其中k是網路中連通集的個數。兩組測試資料之間請輸出一空行分隔。

#include using namespace std;

#define max_n 10001

int par[max_n]; // 父親

int rank[max_n]; // 樹的高度

// 初始化n個元素

void init(int n)

} // 查詢樹的根

int find(int x)

// 合併x和y所屬的集合

void unite(int x, int y)

else }

} // 判斷x和y是否屬於同乙個集合

bool same(int x, int y)

int main()

// 並查集開始

init(num);

cout << "請輸入指令:" << endl;

while(cin >> command)

// 當讀到s時,檢查整個網路。

// 若網路中任意兩機器間都可以傳輸檔案,則在一行中輸出"the network is connected."

// 否則輸出"there are k components."

if(command == 's')

if(count == 1)

else

cout << endl;

cout << "請輸入機器總數:" << endl;

break;

}// 輸入兩個機器

// cout << "請輸入兩個機器編號:" << endl;

cin >> m1 >> m2;

// c開頭的測試,檢查c1和c2間是否可以傳輸檔案

// 若可以,則在一行中輸出"yes",否則輸出"no"。

if(command == 'c')

else

cout << "請輸入指令:" << endl;

}// i表示在c1和c2間輸入一條連線

if(command == 'i')

} }

return 0;}/*

請輸入機器總數:

3請輸入指令:

i 3 1

請輸入指令:

i 2 3

請輸入指令:

c 1 2

yes請輸入指令:

sthe network is connected.

請輸入機器總數:

3請輸入指令:

c 1 2

no請輸入指令:

i 1 2

請輸入指令:

c 1 2

yes請輸入指令:

sthere are 2 components.

*/

檢查網路 並查集

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

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

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

並查集 並查集

本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...