三/四元環計數
三/四元環計數
對於一個 \(n\) 個點,\(m\) 條邊的無向圖
我們可以在 \(O(m\sqrt m)\) 的複雜度內計算出該圖的三/四元環個數
三元環
記 \(d_x\) 表示原圖中點 \(x\) 的度數
考慮將無向圖轉為有向圖
對於一邊 \((u,v)\) 且 \(u<v\)
- 若 \(d_u\geq d_v\) 則 \(u\to v\)
- 若 \(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\)
- 若 \(out_v\leq \sqrt m\) ,複雜度 \(O(m\sqrt m)\)
- 若 \(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\) 點上的標記,並在 \(w\) 上多打一個來自 \(v\) 的tag
複雜度為 \(O(\sum_{(v,w)\in E}edge_v+\sum_{w}in_w)\)
類似討論,可得到複雜度為 \(O(m\sqrt m)\)