poj2492 種類並查集 各種解法

2022-02-20 03:02:31 字數 1622 閱讀 6522

題意: 有t組測試資料, 對於每組資料,第一行n, m分別表示昆蟲的數目和接下來m行x, y,

x, y表示教授判斷x, y為異性, 問教授是否有錯誤判斷,即存在x, y為同性;

這道題和poj1703類似, 不過更簡單一點 (poj1703題解)

解法1: 我們可以用rank[x]記錄x與其父親節點的關係, rank[x]=0表同性, rank[x]=1表異性;

假設前面的教授判斷都是正確的, 若後面存在與前面判斷矛盾的資料,那麼教授判斷有誤;

**:

1 #include 2 #include 3

#define maxn 2010

4using

namespace

std;56

int rank[maxn], pre[maxn]; //

***rank[x]儲存x與其父親節點的關係78

int find(int x)

14return

pre[x];15}

1617

int jion(int x, int

y)else

26 }else

30return0;

31}3233

int main(void)42

int flag=0;43

while(m--)49}

50if

(flag)else55}

56return0;

57 }

解法2:  並查集裡面合併同一性別的昆蟲, 用n+x表示與x性別相反的昆蟲

**:

1 #include 2 #include 3

#define maxn 2010

4using

namespace

std;56

int pre[maxn*2];7

8int find(int x)

1112

void jion(int x, int y)18}

1920

int main(void)28

int flag=0;29

while(m--)else38}

39if

(flag)else44}

45return0;

46 }

解法3: 用vis陣列標記, vis[x]儲存與x性別不同的昆蟲

**:

1 #include 2 #include 3

#define maxn 2010

4using

namespace

std;56

int pre[maxn*2], vis[maxn*2];7

8int find(int x)

1112

void jion(int x, int y)18}

1920

int main(void)29

int flag=0;30

while(m--)else

if(vis[x]+vis[y]==0)else

if(!vis[x])else

if(!vis[y])else48}

49if

(flag)else54}

55return0;

56 }

Poj2492 帶權並查集

題目鏈結在這裡 題目大意 bug分公母,有n個bug,m個描述,每個描述裡有x和y,代表這兩個bug是一對。問給出m個描述之後會不會有同性戀現象。解題思路 每個bug的權值初始時設定成0,權值代表著這個bug和其祖宗的性別差異,如果是1就表示是異性,0代表同性。然後在合併的時候,如果發現它們之前已經...

poj1182 種類並查集

有點坑的題目,不過做做絕對利大於弊,尤其在你不斷wa到哭的時候,大神忽略這句 0 兩者相同級別 1 被根節點吃 2 吃根節點 原因 對於輸入的關係1和2,減1之後便是輸入的兩個量之間的關係 其實是寫完題目之後看解題報告發現這規律的 include include using namespace st...

POJ 1703 種類並查集

題意 乙個城市裡面有兩個黑幫 有兩種操作 a ask 詢問 x,y的關係 d x,y是一夥的 很明顯是種類並查集 於是就yy一下 relationsi 表示與父節點的關係 fatheri 記錄父節點 在合併和查詢root的時候 relations 更新注意一下就可以了 include include...