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 ...