題解 P1892 BOI2003 團夥 C

2022-05-11 16:37:02 字數 799 閱讀 9709

原題傳送門

前置知識:並查集,不會的補了再來。

這道題只是在並查集的基礎上多了乙個操作而已。

這種操作,叫做反集(就先這麼叫著)

題目裡有一種關係是互為朋友,這很好理解,把互為朋友的兩個點合併就可以了。

互為敵人怎麼辦?

用反集!

所謂反集,就是分別把x,y和它們對應的虛點連線起來。(虛點:a的虛點是a+n(點數))

因為乙個人不可能和自己是敵人(至少這道題裡不會),所以x永遠不會和x+n連線起來,但如果x和y+n連線起來了,x和y就永遠不會在乙個並查集裡了。

有了這個特性,最後檢查的時候遍歷一遍1-n,如果它是根節點就ans++,最後輸出即可。

**:

1 #include2

using

namespace

std;

3int n,m,fa[2001],x,y,sz[10001];4

charo;5

void

init()612

}13intget(int

x)14

20void merge(int x,int

y)21

27 fa[r1]=r2;

28 sz[r2]+=sz[r1];

29return;30

}31intmain()

3244}45

int ans=0;46

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

4750 cout51return0;

52 }

洛谷 P1892 BOI2003 團夥

1920年的芝加哥,出現了一群強盜。如果兩個強盜遇上了,那麼他們要麼是朋友,要麼是敵人。而且有一點是肯定的,就是 我朋友的朋友是我的朋友 我敵人的敵人也是我的朋友。兩個強盜是同一團夥的條件是當且僅當他們是朋友。現在給你一些關於強盜們的資訊,問你最多有多少個強盜團夥。輸入格式 輸入檔案gangs.in...

題解 BOI2003 團夥

其實綠色有點看高了此題。此題只需要加乙個 敵人的敵人就是我的朋友 就可以了,而只要乙個人x與另一人y是敵人,x就和y的第乙個敵人是朋友就可以將x弄進y的敵人團夥,而y的敵人將全在那個團夥中 下面是 includeusing namespace std int bcj 5010 int e 5010 ...

BOI2003 團夥(並查集)

1920年的芝加哥,出現了一群強盜。如果兩個強盜遇上了,那麼他們要麼是朋友,要麼是敵人。而且有一點是肯定的,就是 我朋友的朋友是我的朋友 我敵人的敵人也是我的朋友。兩個強盜是同一團夥的條件是當且僅當他們是朋友。現在給你一些關於強盜們的資訊,問你最多有多少個強盜團夥。輸入檔案gangs.in的第一行是...