本題鏈結
題目描述
某市計畫建設乙個通訊系統。按照規劃,這個系統包含若干端點,這些端點由通訊線纜鏈結。訊息可以在任何乙個端點產生,並且只能通過線纜傳送。每個端點接收訊息後會將訊息傳送到與其相連的端點,除了那個訊息傳送過來的端點。如果某個端點是產生訊息的端點,那麼訊息將被傳送到與其相連的每乙個端點。
為了提高傳送效率和節約資源,要求當訊息在某個端點生成後,其餘各個端點均能接收到訊息,並且每個端點均不會重複收到訊息。
現給你通訊系統的描述,你能判斷此系統是否符合以上要求嗎?
輸入
輸入包含多組測試資料。每兩組輸入資料之間由空行分隔。
每組輸入首先包含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...