BOJ 1501 多彩瓜 並查集

2021-06-01 10:14:23 字數 1368 閱讀 8324

description

dalong的舅舅最近到外地旅遊時給dalong帶回來一種神奇的水果:多彩瓜。這種瓜太漂亮了,它有很多層,每一層都是一種顏色。由於多彩瓜放久了會變壞,dalong決定每天吃一層,可是多彩瓜有好多層,每天吃一層的話還沒吃完多彩瓜就壞了,因為多彩瓜顏色很多,dalong把一些很相近的顏色認為是同一種顏色,這樣合併顏色後多彩瓜就沒有原來這麼多層了,dalong就可以在多彩瓜變壞之前吃完它嘍~oh,yeah。現在dalong告訴你多彩瓜最初每一層的顏色,顏色之間的關係,你能幫助他算出吃完這些瓜要幾天麼?注意,如果dalong認為顏色a和顏色b是同一種顏色,顏色b和顏色c是同一種顏色,那麼顏色a和顏色c也是同一種顏色。

input

多組資料測試

對於每組資料

輸入的第一行是乙個正整數n(1 <= n <= 50000),m(1 <= m <= 100)表示多彩瓜最初有n層,一共有m種不同的顏色。

第二行有n個數,第i個數colori表示多彩瓜第i層的顏色(1 <= colori <= m).

第三行是乙個正整數k(0 <= 3000 <= k),表示有k組顏色存在相似認為相同的關係。

後面k行,每行兩個正整數a,b(1 <= a, b <= m 且 a != b),表示dalong認為a和b是同一種顏色。

輸入的最後是兩個0,表示輸入結束,這組資料不用處理

output

對於每組資料,輸出dalong需要幾天吃完多彩瓜

sample input

5 31 1 2 3 1

11 2

0 0sample output

3hint

因為1和2是同一種顏色,那dalong第一天可以吃掉前3層(1,1,2),第二天可以吃掉第四層(3),第三天吃掉最後一層(1)。因此吃完多彩瓜需要3天。

思路:很顯然是點的合併,用並查集。

#include#include#includeusing namespace std;

const int n=50005,m=105;

int n,m;

int in[n];

int father[n];

int find(int u)

return u;

}void union(int a,int b)

else

}int main()

int tmp;

scanf("%d",&tmp);

for(int i=1;i<=tmp;i++)

}int ans=0;

int now=0;

for(int i=1;i<=n;i++)

}printf("%d\n",ans);

}return 0;

}

老BOJ 16 棋盤分割

棋盤分割 accept 46 submit 186 time limit 1000ms memory limit 65536kb description 將乙個 n 1 次後,連同最後剩下的矩形棋盤共有 n塊矩形棋盤。每次切割都只能沿著棋盤格仔的邊進行 原棋盤上每一格有乙個分值,一塊矩形棋盤的總分為...

拔河 動態規劃 BOJ 216

乙個學校舉行拔河比賽,所有的人被分成了兩組,每個人必須且只能夠在其中的一組,要求兩個組的人數相差不能超過1,且兩個組內的所有人體重加起來盡可能地接近。輸入n n 和n n n個整數wi w i代表每個人的體重。輸出兩個整數,分別代表兩組的體重之和。3 100 90 200190 200n 100.n...

BOJ 488 小妹妹個數

題意 給出數字n 1 n 1000000000 求出小於等於n的質數的個數 打表也需要技巧的 10億內有5000多萬個素數,所以沒法直接打出所有的素數直接二分查詢。我們可以利用平方分割的方法,用乙個桶儲存在該桶範圍內中素數的個數。最後再求解的過程中,對於處於桶範圍內的數,直接求和,處在桶範圍外的數,...