並查集模板

2021-07-23 14:30:48 字數 3185 閱讀 7105

codevs 2597 團夥

題目描述 description

2023年的芝加哥,出現了一群強盜。如果兩個強盜遇上了,那麼他們要麼是朋友,要麼是敵人。而且有一點是肯定的,就是:

我朋友的朋友是我的朋友;

我敵人的敵人也是我的朋友。

兩個強盜是同一團夥的條件是當且僅當他們是朋友。現在給你一些關於強盜們的資訊,問你最多有多少個強盜團夥。

輸入描述 input description

輸入檔案gangs.in的第一行是乙個整數n(2<=n<=1000),表示強盜的個數(從1編號到n)。 第二行m(1<=m<=5000),表示關於強盜的資訊條數。 以下m行,每行可能是f p q或是e p q(1<=p q<=n),f表示p和q是朋友,e表示p和q是敵人。輸入資料保證不會產生資訊的矛盾。

輸出描述 output description

輸出檔案gangs.out只有一行,表示最大可能的團夥數。

樣例輸入 sample input

6 4

e 1 4

f 3 5

f 4 6

e 1 2

樣例輸出 sample output

3資料範圍及提示 data size & hint

2<=n<=1000

1<=m<=5000

1<=p q<=n

思路:敵人的敵人是朋友這個地方可能不太好想怎麼處理,其實只要開個陣列記錄一下,每次有新的敵人關係出現的時候就可以拿來判斷了。

題解:

#include

#include

using

namespace

std;

struct cca[5005];

int f[5005];

int recond[5005];

int n,m;

int find(int w)

return f[w];

}int main()

int tot=0;

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

}else

}if(recond[a[i].y])

}recond[a[i].x]=a[i].y;}}

int ans=0;

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

}printf("%d",ans);

return

0;}

—————————————————-華麗的分割線———————————————————-

codevs 1073 家族

題目描述 description

若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,現在給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。 規定:x和y是親戚,y和z是親戚,那麼x和z也是親戚。如果x,y是親戚,那麼x的親戚都是y的親戚,y的親戚也都是x的親戚。

輸入描述 input description

第一行:三個整數n,m,p,(n<=5000,m<=5000,p<=5000),分別表示有n個人,m個親戚關係,詢問p對親戚關係。 以下m行:每行兩個數mi,mj,1<=mi,mj<=n,表示ai和bi具有親戚關係。 接下來p行:每行兩個數pi,pj,詢問pi和pj是否具有親戚關係。

輸出描述 output description

p行,每行乙個』yes』或』no』。表示第i個詢問的答案為「具有」或「不具有」親戚關係。

樣例輸入 sample input

6 5 3

1 21 5

3 45 2

1 31 4

2 35 6

樣例輸出 sample output

yesyes

no資料範圍及提示 data size & hint

n<=5000,m<=5000,p<=5000

並查集模板:

#include

#include

using

namespace

std;

int n,m,q;

int f[20000+5];

int find(int w)

return f[w];

}int main()

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

}for(int i=1;i<=q;i++)

else

}return

0;}

————————————————–華麗的分割線———————————————————

codevs 3554 犯罪團夥

題目描述 description

警察抓到了n個罪犯,警察根據經驗知道他們屬於不同的犯罪團夥,卻不能判斷有多少個團夥,但通過警察的審訊,知道其中的一些罪犯之間相互認識,已知同一犯罪團夥的成員之間直接或間接認識。有可能乙個犯罪團夥只有乙個人。請你根據已知罪犯之間的關係,確定犯罪團夥的數量。已知罪犯的編號從1至n。

輸入描述 input description

第一行:n(<=10000,罪犯數量),

第二行:m(<100000,關係數量)

輸出描述 output description

乙個整數,犯罪團夥的數量。

樣例輸入 sample input

111 2

4 53 4

1 35 6

7 10

5 10

8 9樣例輸出 sample output

3資料範圍及提示 data size & hint

共10個測試資料:

(1)5個資料n<=1000,m<=5000;

(2)5個資料:10000>n〉=9000, 100000>m〉=90000;

並查集模板:

#include

#include

using

namespace

std;

int n,m;

int f[20000+5];

int find(int w)

return f[w];

}int main()

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

}int ans=0;

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

}printf("%d",ans);

return

0;}

並查集模板

來自lifeng wang http hi.baidu.com fandywang jlu 前輩06年寫的東西,追隨前人足跡繼續努力。並查集的一些題目和相關解題報告 poj 1611 the suspects 最基礎的並查集 poj 2524 ubiquitous religions 最基本的並查集...

並查集模板

普通並查集 define max size 100005 int pa max size 儲存有向圖的邊 void init 初始化 該函式可以根據具體情況儲存和初始化需要的內容 int findset int a 不帶路勁壓縮 return a void union nodes int a,int...

並查集模板

2 17 演算法筆記 並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。其擁有如下特點 1,資料的聯通具有無向性,也就是說在合併子集和時,無向圖也只有一步 2 在最小生成樹中,可以根據並查集來判斷連通性而通過最小生成樹 頂點數...