True Liars 擴充套件域並查集

2021-09-01 05:56:54 字數 996 閱讀 9734

傳送門

每個點拆成兩個,表示好人或壞人

我們合併集合後,發現存在幾組對立的集合

也就是說這個集合和與它對立的集合只能選乙個

我們用rt1[i] , rt2[i] 表示第i個集合 和 與第i個集合對立的集合

cnt1,cnt2表示該集合好人的個數

用f[i][j]表示到第i個集合,好人為j的方案數

同時記錄from[i][j] 表示f[i][j]選的是第i組集合的哪乙個集合

#include#include#include#define n 305*2*2

using namespace std;

int fa[n],n,p1,p2,rt1[n],rt2[n],tot;

int cnt1[n],cnt2[n],f[n/2][n/2],from[n/2][n/2];

int pre[n],vis[n],ans[n];

void dfs(int i,int j)

int find(int x)

void init()

int main()

if(s[0]=='n')

} for(int i=1;i<=p1+p2;i++)

for(int i=1;i<=tot;i++) rt2[pre[i]+p1+p2]=i;

for(int i=1;i<=p1+p2;i++)

f[0][0]=1;

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

for(int j=min(cnt1[i],cnt2[i]);j<=p1;j++)

if(f[tot][p1]!=1)

dfs(tot,p1);

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

for(int i=1;i<=p1+p2;i++) if(ans[i]) printf("%d\n",i);

printf("end\n");

}return 0;

}

並查集的擴充套件域

核心思想 fa a 儲存與a同類的 fa a 1 n 儲存與a發生第一類關係的 fa a 2 n 儲存與a發生第二類關係的 fa a 3 n 儲存與a發生第三類關係的 分析將並查集中儲存節點關係的f陣列擴大2倍,1 n表示朋友,n 1 2 n表示敵人。那麼對於x,y,如果x和y是朋友,直接合併,如果...

詳解 並查集高階技巧 加權並查集 擴充套件域並查集

可以理解為使用陣列實現的樹形結構,只儲存了每個節點的父節點 前驅 功能為 合併兩個節點 及其所在集合 查詢節點所屬集合的代表節點 可以理解為根節點 以6個元素為例 編號0到5 把0單獨劃分為乙個集合 把1,2,3,4劃分為乙個集合 把5單獨劃分為乙個集合。n個元素的並查集,只需要乙個容量為n的陣列f...

食物鏈 並查集擴充套件域

食物鏈 2001年noi全國競賽 時間限制 3 s 空間限制 64000 kb 題目描述 description 動物王國中有三類動物 a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。...