今日頭條的並查集題

2021-08-26 17:46:43 字數 2188 閱讀 7738

入秋以來,睏意綿綿,特此刷題,清醒一下。

題目如下:

bytedance efficiency engineering 團隊在8月20日搬入了學清嘉大廈,為慶祝團隊的喬遷之喜,位元組軍決定邀請ee團隊,舉辦乙個大型交友會。每每題目說道這裡肯定有乙個問題,那麼問題如下:

ee團隊一共有n個人,大家都比較害羞,不善於和陌生人交流,這n個人都向位元組君提供了自己認識人的名字,但不包括自己(我想是因為乙個人可能一生都沒有辦法清醒的認識到自己吧)。如果a的名單裡有b,或者b的嗎名單裡有a,則代表a和b是互相認識的。同時,如果a認識b,b認識c,則代表a,c也會很快認識,畢竟是通過b這個小媒婆介紹的,兩人就可以很快互相認識了。

位元組君打算將整個團隊分成m組,每組內人員全都可以通過間接或者直接的方式互相認識,而組間的人員互相都不認識。

請您確定乙個方案,確定m的最小值。

輸入描述:

第一行乙個整數n,代表這個團隊一共有n個人,從1開始編號。

接下來有n行,第x+1行代表編號為x的人認識的人的編號 k (1<=k<=n),每個人的名單以0代表結束。

輸出描述:

乙個整數m,代表可以分割的最小的組的個數。

輸入例項:

10 0

5 3 0

8 4 0

9 0

9 0

3 0

0 7 9 0

0 9 7 0

輸出:

2

一開始看這題,以為是要求圖的聯通分量,又要開闢空間,效率很定不高。所以改為用並查集來做這件事情,因為並查集可以很好的解決這種相親交友,道路修建問題。

並查集,在一些有n個元素的集合應用問題中,我們通常是在開始時讓每個元素構成乙個單元素的集合,然後按一定順序將屬於同一組的元素所在的集合合併,其間要反覆查詢乙個元素在哪個集合中。並查集是一種樹型的資料結構,用於處理一些不相交集合(disjoint sets)的合併及查詢問題。常常在使用中以森林來表示。

下面說一說並查集的兩個最重要的操作,

一、查詢操作:

//將此團隊中的每個人進行編號,id[x]儲存了標號為x的人它的祖先,例如,id[3]=6,則說明,編號為3的這個人,它的祖先的編號為6,類似於樹的儲存結構。

//如果,這個人他很孤單,它不認識任何人,那麼他的祖先就是他自己,即id[3]=3

int find(int x) // x為某個人的編號

return x; //最終轉換到根節點

}

二、合併操作:
void union(int p,int q) //找 p,q兩個人的祖先,看誰包含的元素多,就將另乙個根節點掛到這個元素多的根節點上。也就是弱者被吞併了。

else

}

也可以加乙個判斷連通性的操作:

bool connected(int p,int q)

return

false;

}

本題的全部**:

#include

#include

#include

#include

using namespace std;

const

int n(100001);

int n,m,q;

int sz[n];//以當前節點為根的子樹中節點的個數,即為權重

intid[n];

bool ff[n]= ;

int find(int x)

return x;

}void union(int p,int q)

else

}bool connected(int p,int q)

return

false;

}int main()

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

else}}

int ans=0;

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

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

return

0;}

還有一點輸入輸出的技巧沒記完,下午接著寫寫,好餓好餓,去吃飯了~~~~~~

今日頭條程式設計題

第一題 p為給定的二維平面整數點集。定義 p 中某點x,如果x滿足 p 中任意點都不在 x 的右上方區域內 橫縱座標都大於x 則稱其為 最大的 求出所有 最大的 點的集合。所有點的橫座標和縱座標都不重複,座標軸範圍在 0,1e9 內 如下圖 實心點為滿足條件的點的集合。請實現 找到集合 p 中的所有...

演算法題 2018今日頭條程式設計題二

使用dp i,j 表示區間 i,j 能得到計算值的最大值 k表示區間 i,j 的最小值min的下標索引 則序列結構可表示如下 i,k 1 min k 1,j i,j 所有子區間分為兩種情況 包含min 不包含min 在所有包含min的子區間 m,n 中,計算值 mi n su m m,n mi n ...

演算法題 2018今日頭條程式設計題一

維持乙個當前邊界點的陣列,按x從小到達排序,由於是邊界點,故其y對應是從大到小排序的。對於乙個新加入的點,分別按x和y座標值二分查詢其在邊界點陣列中的位置 iter x iter y include include include include include include using name...