統計連通塊種類和數量,數量比較容易使用洪氾即可快速完成,主要是統計種類。因此本文重點放在連通塊判重上。
判重一般可以聯想到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 ...