1. 程式人生 > 其它 >三/四元環計數

三/四元環計數

三/四元環計數

對於一個 \(n\) 個點,\(m\) 條邊的無向圖

我們可以在 \(O(m\sqrt m)\) 的複雜度內計算出該圖的三/四元環個數

三元環

\(d_x\) 表示原圖中點 \(x\) 的度數

考慮將無向圖轉為有向圖

對於一邊 \((u,v)\)\(u<v\)

  1. \(d_u\geq d_v\)\(u\to v\)
  2. \(d_u<d_v\)\(v\to u\)

我們可以證明連出的新圖為一個有向無環圖

若存在環 \((a_0,a_1,...,a_k)\)

\(d_{a_0}\geq d_{a_1}\geq d_{a_2}...\geq d_{a_k}\geq d_{a_0}\)

\(d_{a_0}=d_{a_1}=...=d_{a_k}\)

所以 \(a_0<a_1<a_2<...<a_k<a_0\),矛盾

顯然原圖中的三元環 \((u,v,w)\) 在新圖中的表現形式一定為 \(u\to v,u\to w,v\to w\)

我們考慮在 \(u\) 點處計數

列舉 \(u\),給 \(u\) 在新圖上可一步到達的點打標記,再列舉點 \(v\),列舉 \(w\) 判斷是否被 \(u\) 標記過

計數即可

考慮將列舉 \(w\) 的複雜度記在邊 \(u\to v\) 上,為 \(out_v:v的出度\)

總複雜度為\(\sum_{(u,v)\in E}out_v+\sum_{u}out_u\)

  1. \(out_v\leq \sqrt m\) ,複雜度 \(O(m\sqrt m)\)
  2. \(out_v>\sqrt m\),又 \(out_u>\sqrt m\),總共僅有 \(m\) 條邊,這樣的 \((u,v)\) 僅有 \(O(\sqrt m)\) 個,複雜度 \(O(m\sqrt m)\)

四元環

同樣考慮按三元環的方法建出新圖

顯然一個四元環在新圖中至少有一個度數為2的點,至多2個這樣的點,我們保證在度數最大的那個點計數即可

考慮一個四元環 \((u,v,w,x)\),我們分成 \(u-v\to w,u-x\to w\) 兩條鏈計算

列舉 \(u\) ,列舉原圖的邊以列舉 \(v\)

,再列舉 \(w,(d_u>d_w \space or \space u<w)\)

答案算上 \(w\) 點上的標記,並在 \(w\) 上多打一個來自 \(v\) 的tag

複雜度為 \(O(\sum_{(v,w)\in E}edge_v+\sum_{w}in_w)\)

類似討論,可得到複雜度為 \(O(m\sqrt m)\)