BZOJ4264 小C找朋友

2021-07-09 17:58:56 字數 1178 閱讀 6944

description

幼兒園裡有n個小c,兩個小c之間可能是朋友也可能不是。所有小c之間的朋友關係構成了乙個無向圖,這個無向圖中有m條邊。

園長atm發現對於兩個(不同的)小ci和j,如果其他的所有小c要麼同時是i,j的朋友,要麼同時不是i,j朋友的話,這兩個小c就很有可能一起去吃飯,成為一對好友。出於一些未知的原因,atm需要你幫他求出可能成為好友的小c的對數。

input

第一行乙個數n,m,如題目描述。

接下來m行,每行2個數表示一條無向邊。

output

輸出可能成為好*友的小c的對數。

sample input

3 31 2

2 31 3

sample output

3 hint

n,m<=1000000

source

跟zky學長學習了新姿勢:邊集hash

#include

#include

#include

#include

#include

#define maxn 1000010

#define get (ch>='0'&&ch<='9')

#define ll long long

using namespace std;

int n,m;

ll val[maxn],hash[maxn];

ll ans,cnt;

struct edge

}e[maxn];

void

in(int &x)

int main()

sort(e+1,e+m+1);m=unique(e+1,e+m+1)-e-1;

for (int i=1;i<=m;i++) if (e[i].u!=e[i].v) hash[e[i].u]^=val[e[i].v],hash[e[i].v]^=val[e[i].u];

for (int i=1;i<=m;i++) if (e[i].u!=e[i].v&&((hash[e[i].u]^val[e[i].v])==(hash[e[i].v]^val[e[i].u]))) ans++;

sort(hash+1,hash+n+1);

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

cout<}

bzoj4264 小C找朋友

怎麼說呢,這應該算是一種新知識吧,圖上hash。具體做法就是每個點都附上乙個初值,然後把每個點所連的點的值 合 起來,然後就可以判斷相連的點是否一樣了 不包括自己 如果要讓自己也在的話,再 合 上自己就好了。關於怎麼 合 有多種方法,感覺一般採用二進位制運算,因為不用考慮順序呀。好像異或的正確率比較...

4264 小C找朋友(hash)

幼兒園裡有 n n 個小c role presentation style position relative c c,兩個小 c c 之間可能是朋友也可能不是。所有小 c role presentation style position relative c c之間的朋友關係構成了乙個無向圖,這個...

4264 小C找朋友 hash

這道題目一眼就hash啊 但是我還是沒做出來,因為我的hash方法太過 了,直接用乙個二進位制表示每個人的朋友集合 正解的hash方法其實也接觸過,但是我沒用過太多,記錄一下 給每個人隨機乙個很大的權值,乙個人朋友集合的表示方法就是把它的朋友的權值異或起來。include using namespa...