並查集 分身法

2021-08-01 02:45:34 字數 1966 閱讀 8930

參考

試題描述

俗話說得好,敵人的敵人就是朋友。

現在有n個人,編號1至n,初始互不相識。接下來有m個操作,操作分為兩種:

(1)檢查x號和y號是否是朋友,若不是,則變成敵人

(2)詢問x號的朋友有多少個

請你針對每個操作中的詢問給出回答。

輸入 第一行兩個正整數n、m,表示人的數量和操作的數量。

接下來m行,依次描述輸入。每行的第乙個整數為1或2表示操作種類。對於操作(1),隨後有兩個正整數x,y。對於操作(2),隨後乙個正整數x。

輸出 輸出包含m行,對於操作(1),輸入』n』或」y」,』n』表示x和y之前不是朋友,』y』表示是朋友。對於操作(2),輸出x的朋友數量。

輸入示例

5 8

1 1 2

1 1 3

1 2 3

2 3

1 4 5

2 3

1 1 4

2 3

輸出示例

n n

y 1

n 1

n 2

其他說明

n,m<=300000。

對於80%的資料,不包含操作2。

#include 

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 3e5+5;

int f[maxn*2];

int size1[maxn];

int findf(int k)

return r;

}void merge1(int a,int b)

}int main()

else

printf("y\n");

}else

if(q==2)

}}

試題描述

有n只動物分別編號為1,2,……,n。所有動物都屬於a,b,c中的一類。已知a能吃掉b,b能吃掉c,c能吃掉a。按順序給出下面的兩種資訊共k條:

第一種:x和y屬於同一類;

第二種:x吃y。

然而這些資訊可能會出錯,有可能有的資訊和之前給出的資訊矛盾,也有的資訊可能給出的x和y不在1到n的範圍內。求在k條資訊中有多少條是不正確的。計算過程中,我們將忽視諸如此類的錯誤資訊。

輸入 第一行兩個自然數,兩數間用乙個空格分隔,分別表示n和k,接下來的k行,每行有三個數,第乙個數為0或1,分別對應第一種或第二種,接著的兩個數,分別為該條資訊的x和y,三個數兩兩之間用乙個空格分隔。

輸出 乙個自然數,表示錯誤資訊的條數。

輸入示例

100 7

0 101 1

1 1 2

1 2 3

1 3 3

0 1 3

1 3 1

0 5 5

輸出示例

3 其他說明

資料範圍:1<=n<=50000,0<=k<=100000,其它說有輸入都不會超過100000.

#include 

#include

#include

#include

#include

using namespace std;

const int maxn = 5e4+5;

int f[maxn*3];

int findf(int k)

return r;

}void merge1(int a,int b)

return ;

}int main()

}else}}

}}

printf("%d\n",ans);

return

0;}

並查集 並查集

本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...

並查集入門(普通並查集 帶刪除並查集 關係並查集)

什麼是並查集?通俗易懂的並查集詳解 普通並查集 基礎並查集 例題 題解 how many tables problem description lh boy無聊的時候很喜歡數螞蟻,而且,還給每乙隻小螞蟻編號,通過他長期的觀察和記錄,發現編號為i的螞蟻會和編號為j的螞蟻在一起。現在問題來了,他現在只有...

並查集,帶權並查集

題意 ignatius過生日,客人來到,他想知道他需要準備多少張桌子。然而一張桌子上面只能坐上相互熟悉的人,其中熟悉可定義成為a與b認識,b與c認識,我們就說a,b,c相互熟悉 例如a與b熟悉and b與c熟悉,d與e熟悉,此時至少需要兩張桌子。輸入 t表示樣例個數,n表示朋友個數,朋友從1到n編號...