100個小問題 每日一題 第4題

2021-05-23 03:09:38 字數 1018 閱讀 6056

problem4:連通性問題 

假如已知乙個整數對序列,其中每個整數代表某種型別的乙個物件,而且將p-q對解釋成"p與q連通"。假定連通關係是可傳遞的,即:如果p與q連通,同時q與r連通,則p與r也連通。 

任務:編寫乙個程式,從乙個整數對結合中過濾額外的鏈結對。即當程式輸入乙個整數對p-q,僅當程式此時已經看到的對不能通過可傳遞性證明p與q連通時,它才輸出該對。如果前面的對表明p與q連通,則程式應該忽略p-q,並且繼續輸入下乙個對。 

樣列輸入: 

3 4 

4 9 

8 0 

2 3 

5 6 

2 9 

5 9 

7 3 

4 8 

5 6 

0 2 

6 1 

樣列輸出: 

3 4 

4 9 

8 0 

2 3 

5 6 

5 9 

7 3 

4 8 

6 1 

恩,大家回答得都比較對,這個題目的最好解答就是用並集查詢,ysg同學的演算法實現了直接的並集查詢但是對於有n個物件何m個對的連通性問題,ysg同學的演算法時間複雜度為o(m*n)。而事實上,正如他所說在實現時,可以通過開闢乙個陣列來儲存每顆樹的節點數,在連通時,總是連通較小的樹連線到較大樹,這樣可以保證在判斷n個物件的其中兩個物件是否連通時,最多需要跟蹤2lgn個節點,最後的優化的就是進行路徑壓縮。 

以下是paoblem4的乙個比較好的實現,在路徑壓縮時使用的是對分路徑壓縮。具體過程請大家自己分析一下語句,順便分析一下演算法的效能,並且思考如何產生一組輸入串行使下面程式生成一條長度為5的搜尋路徑. 

#include

#define max_n  10000 

int main()  

while (scanf("%d %d", &p, &q) == 2) else  

printf("%d/t%d/n", p, q); 

} return 0; 

每日一題 some小問題集合

classa object defshow self print this is the a show classb object defshow self print this is the b show obj b obj.show obj.class a obj.show this is th...

每日一題(4)

思路 先用快慢指標找到鍊錶的中點,然後翻轉鍊錶後半部分,再和前半部分組合。注意 把鍊錶分成兩半時,前半段的尾節點要置為null,翻轉鍊錶時也要把尾節點置為null。definition for singly linked list.struct listnode class solution 此時的...

每日一題 獎金問題

一 問題描述 二 問題分析 涉及資料 利潤profit,獎金bonus 資料間的關係 當profit 10w,bonus profit 0.1 當profit 20w,bonus 100000 0.1 profit 100000 0.075 三 由使用者輸入乙個利潤,並將輸入轉換為整數型方便進行比較...