1094 並查集3(校園白社會)

2021-08-04 06:58:06 字數 1203 閱讀 2045

時間限制: 1 sec 記憶體限制: 128 mb

題目描述

校園內有很多白社會團夥,他們專做好事。經過長期的臥底,學校有n個人,任何兩個認識的人不是朋友就是敵人,而且滿足:①我朋友的朋友是我的朋友;②我敵人的敵人是我的朋友。所有是朋友的人組成乙個團夥。現在擁有關於這n個人的m條資訊(即某兩個人是朋友,或某兩個人是敵人),請你計算出這個城市最多可能有多少個白社會團夥。

資料範圍:2≤n≤2000,1≤m≤5000。

輸入資料

第一行包含乙個整數n,第二行包含乙個整數m,接下來m行描述m條資訊,內容為以下兩者之一:「f x y」表示x與y是朋友;「e x y」表示x與y是敵人(1≤x≤y≤n)。

輸出資料

包含乙個整數,即可能的最大團夥數。

樣例輸入64

e 1 4

f 3 5

f 4 6

e 1 2

樣例輸出

3//這題沒全過

//過了83%回頭再修改看看**有問題。

運用了乙個反集和並查集的思想

1-n為朋友 n+1-2n為敵人集合

前面的自然用並查集即可

後面因為敵人的敵人是朋友

f[find(x+n)]=find(y);//x與y是敵人

f[find(y+n)]=find(x); //y的敵人與x是朋友

最後掃一遍誰的father還是自己那麼就為乙個團夥。

(p.s第一遍打成if(f[x!=x])結果過了83%,改回來結果56%…mi

#include

#include

using

namespace std;

int n,m;

int flag;

int flag1[

11000];

int f[

2500];

intfind

(int x)

return f[x];}

intmain()

for(

int i=

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

int s=0;

for(

int i=

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

(f[i]

==i) s++

;printf

("%d"

,s);

return0;

}

1487 島嶼3 並查集)

description h國正在進行一項持續n周的填海造島工程。整片工程海域可以被看作是1000x1000的網格。每週都有一塊1x1的單位方格海域被填成陸地。如果我們將連成一片的陸地 一塊單位方格與它上下左右4個單位方格是相連的 視為島嶼,h國想監測每週末整片海域中一共存在有多少個島嶼,以及這些島嶼...

小公尺2023年校園招聘筆試題 簡單並查集

九度 題目描述 假如已知有n個人和m對好友關係 存於數字r 如果兩個人是直接或間接的好友 好友的好友的好友.則認為他們屬於同乙個朋友圈,請寫程式求出這n個人裡一共有多少個朋友圈。假如 n 5 m 3 r 表示有5個人,1和2是好友,2和3是好友,4和5是好友,則1 2 3屬於乙個朋友圈,4 5屬於另...

2020 牛客多校3 G(並查集)

就是將乙個集合所有與其直接相連的集合合併,被合併的集合消失。比如1並到0中,那麼0,1所屬的集合都為0。題目中直接開佇列開不下,改成vector合併集合會t,看大佬的 發現用鏈式前向星做邊,再加個tail陣列用來o 1 合併就行 也可以用list的splice 合併,都是o 1 的 向當於將另一集合...