連通塊判重

2021-10-18 04:11:57 字數 2687 閱讀 8186

統計連通塊種類和數量,數量比較容易使用洪氾即可快速完成,主要是統計種類。因此本文重點放在連通塊判重上。

判重一般可以聯想到hash,難點也是hash函式的設計,如何避免衝突。

t1 影象儲存

只有上下左右連通,平移重合則相似

hash函式設計

把dfs第幾步走的方向作為hash的引數,直接用string儲存,步數做乙個取模來防止string太大了

如果不新增是第幾步的話會衝突

}大佬的寫法

hash函式設計:

把步數換成了base累積,同時採用雙hash降低衝突概率

推薦部落格

#include

#include

#define mod 998244353

using

namespace std;

int a[

1005][

1005

],now1,now2;

const

int fx[5]

=,fy[5]

=;const

int base1=27;

const

int base2=23;

inline

void

dfs(

int x,

int y)

} now1=((

long

long

)now1*base1+11)

%mod;

now2=((

long

long

)now2*base2+13)

%mod;

//雙雜湊操作序列

}map <

int,

int> mp1,mp2;

intmain

(int argc,

char

** ar**)

}int cnt=

0,ans=0;

for(

int i=

1;i<=n;i++)}

} cout << cnt <<

" "<< ans <<

"\n";}

return0;

}

t2 星空之夜

八個方向,旋轉翻轉也算相似

hash函式設計:

把連通塊內點存下來,以塊與塊內的歐式幾何距離之和hash

注意要使用double否則極其容易衝突,同時需要注意浮點數的閾值設定

#include

using

namespace std;

#define x first

#define y second

typedef pair<

int,

int> pii;

const

int n=

110;

const

double eps=

1e-6

;int n,m;

char g[n]

[n];

pii q[n*n]

;int top;

double

get_dist

(pii a,pii b)

double

get_hash()

char

get_id

(double key)

void

dfs(

int a,

int b)

; g[a]

[b]=

'0';

for(

int x=a-

1;x<=a+

1;x++

)for

(int y=b-

1;y<=b+

1;y++)}

intmain()

}for

(int i=

0;i)cout<

<

}

字串儲存:儲存方便但要注意不要讓字串太大

數值儲存:取模的質數稍微開大些,如果是浮點數注意閾值設計

衝突處理:雙hash,多次hash,新增引數

圖的hash一般考慮:距離,dfs序

小花梨判連通

美登杯 上海市高校大學生程式設計邀請賽 華東理工大學 2019年5月18日 problemc 小花梨判連通 時間限制 2000ms 空間限制 512mb description 小花梨給出n個點,讓k位同學對這n個點任意新增無向邊,構成k張圖。小花梨想知道對於每個點i,存在多少個點j 包括i本身 使...

連通塊計數

小 a 有一棵長的很奇怪的樹,他由 n 條鏈和 1 個點作為根構成,第 i 條鏈有 ai 個點,每一條鏈的一端都與根結點相連。現在小 a 想知道,這棵長得奇怪的樹有多少非空的連通子樹,你只需要輸出答案對 998244353 取模的值即可 第一行乙個正整數 n 第二行 n 個正整數 a1 an 輸出答...

C 小花梨判連通

題意 給你k張圖,每個圖有點和邊。輸出每個點1 2.n的點在每張圖裡面都聯通的點的個數。思路 染色也行,並查集也行。在k張圖裡面給每個點染色。比如有3個點,4張圖。染色情況如下 點1 1 1 1 1 點2 1 1 2 2 點3 1 1 2 2 將每個點的k個染色情況作為map的key,點2 1 1 ...