個人筆記 演算法講座5 1 積木1

2021-10-04 17:23:11 字數 1775 閱讀 8772

alice在玩樂高積木,這種積木能互相拼接到一起。alice為每塊積木編了號,為1,2,……n,她計畫構造乙個複雜的積木世界,因此按順序在圖紙上寫下了需要互相拼接的積木編號。bob看到了這份圖紙,他想搗亂,想把所有的積木拼接成乙個整體,他至少需要準備多少塊積木?

資料有t組。每組第一行為n,m,表示這次拼接的積木數和拼接次數。接下來的m行都有兩個數a,b,表示將積木a和b進行拼接。

有t行,每行表示對這組資料,bob至少要準備的積木個數。

按照並查集的思想只要兩者之間有聯絡就將兩者之間產生一條聯絡,如果兩者之間已有聯絡則不用進行處理,最後查詢每乙個祖先節點所包含的節點個數(包括他自己),找到含有節點數最多的那個,即為所求

init函式:

先申請乙個一維陣列,每乙個節點都代表第n個元素,每個節點上儲存該節點的父親節點的下標,初始時他的父親節點下標是他自己

union函式:

將兩個節點之間建立一條聯絡,即將第乙個節點的父親節點化為第二個節點的父親節點,如何判斷是第乙個節點還是第二個節點呢?可以利用迴圈或者遞迴找到該節點的高度,比較兩者高度大小,高度小的節點的父親節點設定為高度高的父親節點的下標。(此時將該並查集視為一張無向圖處理)(使用啟發式合併)

find函式:

在對兩個節點是否需要進行union之前需要進行判斷兩個節點的祖先節點是否是同乙個節點,如果是同乙個節點,則不需要進行union合併兩個節點的祖先節點。在查詢兩個節點的祖先節點時,可以利用迴圈判斷 a[n]==n ? 如果不等於說明該節點並不是祖先節點,然後進行 n=a[n];

4 21 3

4 33 3

1 21 3

2 35 2

1 23 5

999 0 1

02998

15 12

1 11

2 68 3

4 27 12

13 15

10 11

9 412 14

15 10

11 13

14 7

//

// main.cpp

// 拼接需要積木

//// created by xxc on 2020/4/2.

//#include

#define maxsize 1000000

using

namespace std;

int list[maxsize]

;int flag[maxsize]

;int

find

(int x)

//路徑壓縮

intr

(x),c(

0);while

(list[r]

!=r)

return ans;

}void

join

(int a,

int b)

while

(list[bb]

!=bb)

if(count_aelse

}int

count

(int n)

void

init

(int n,

int m)

for(

int i=

1; i<=m; i++

)for

(int i=

1; i<=n; i++)}

intmain

(int argc,

const

char

* ar**)

return0;

}

個人筆記 演算法講座4 1 畫板

alice熱愛繪畫,聖誕節時bob送了一塊木板給她,作為她作品牆。以後alice每畫好一幅畫,就用兩個夾子夾在木板的上邊緣欣賞。所有的畫都是矩形的。且不會超出作品牆的範圍。bob也會經常來看看作品牆還剩餘多少面積沒有被覆蓋。一旦剩餘的面積少於原面積的1 2,bob就要去買一塊新的木板了。輸入第一行a...

個人筆記 演算法講座3 揹包問題及其變種

設計乙個動態規劃問題需要首先搞清楚他的 同質子結構 狀態轉移方程 備忘錄 即動態規劃中動態儲存資料的東西 如果將揹包問題用方程 f w,i 表示 w 為揹包容量,i 為物品個數 則對於每乙個物品,只需要考慮裝入揹包 or 不裝入揹包這兩個情況 對於 f 4,3 9 i 3 weight 8,valu...

C51 矩陣按鍵 個人筆記

每個按鍵一端和同行一端相連 jp4的高4位 另一端和同列一端相連 jp4的低4位 for int i 8 i 3 i include typedef unsigned int u16 typedef unsigned char u8 define delaytime 50000000 define ...