演算法筆記練習 9 6 並查集 問題 A 通訊系統

2021-10-05 17:57:40 字數 1643 閱讀 5596

本題鏈結

題目描述

某市計畫建設乙個通訊系統。按照規劃,這個系統包含若干端點,這些端點由通訊線纜鏈結。訊息可以在任何乙個端點產生,並且只能通過線纜傳送。每個端點接收訊息後會將訊息傳送到與其相連的端點,除了那個訊息傳送過來的端點。如果某個端點是產生訊息的端點,那麼訊息將被傳送到與其相連的每乙個端點。

為了提高傳送效率和節約資源,要求當訊息在某個端點生成後,其餘各個端點均能接收到訊息,並且每個端點均不會重複收到訊息。

現給你通訊系統的描述,你能判斷此系統是否符合以上要求嗎?

輸入

輸入包含多組測試資料。每兩組輸入資料之間由空行分隔。

每組輸入首先包含2個整數n和m,n(1<=n<=1000)表示端點個數,m(0<=m<=n*(n-1)/2)表示通訊線路個數。

接下來m行每行輸入2個整數a和b(1<=a,b<=n),表示端點a和b由一條通訊線纜相連。兩個端點之間至多由一條線纜直接相連,並且沒有將某個端點與其自己相連的線纜。

當n和m都為0時,輸入結束。

輸出

對於每組輸入,如果所給的系統描述符合題目要求,則輸出yes,否則輸出no。

樣例輸入

4 3

1 22 3

3 43 1

2 30 0

樣例輸出

yes

no

並查集的思路及**實現參考演算法筆記 p328,這個題需要動腦子的地方在於題目的要求:「並且每個端點均不會重複收到訊息」。從圖的角度來說,本題要求圖是連通的,同時圖的內部不能形成環。

如何判斷形成環了呢?從並查集的角度,如果在合併結點a和結點b的時候發現它們原本就屬於同乙個集合,那麼說明這兩個結點所在的集合就形成環了,應該輸出no

如何判斷圖是連通的?接收所有輸入後如果所有結點都只有乙個共同的father結點,則圖是連通的。

#include

#include

#include

using

namespace std;

vector<

int> father;

set<

int> roots;

intfindfather

(int x)

return f;

}bool

union

(int a,

int b)

}int

main()

if(!flag)

for(

int i =

1; i <= n;

++i)

roots.

insert

(findfather

(i));if

(roots.

size()

==1)puts

("yes");

else

puts

("no");

}return0;

}

《演算法筆記》9 6 並查集

一.定義 實現 int father n father i j 表示 j 的父親結點是 i father i i 表示元素 i 是該集合的根結點 二.基本操作 1.初始化 for int i 1 i n i father i i 2.查詢 非遞迴實現 int findfather int x 遞迴實...

演算法筆記 並查集

專題 並查集 一 引入 在一些有n個元素的集合應用問題中,我們通常是在開始時讓每個元素構成乙個單元素的集合,然後按一定順序將屬於同一組的元素所在的集合合併,其間要反覆查詢乙個元素在哪哪個集合中。該問題看似並不複雜,但資料量極大,若用正常的資料結構來描述的話,往往超過了空間的限制,計算機無法承受 而且...

並查集演算法筆記

並查集是一種用來管理元素分組情況的資料結構,並查集可以高效的進行如下操作 使用樹狀結構來實現 在樹形資料結構中,如果發生了退化的情況,複雜度就會變得很高。在並查集中,可以按照如下方法避免退化 並查集複雜度平均下來每次查詢和合併的複雜度都是常數的 阿克曼函式 leetcode 547.friend c...