三元環 四元環計數

2022-05-09 10:24:11 字數 830 閱讀 4902

這東西其實就是一種暴力,只不過巧妙的是每乙個環恰好統計了一次。

三元環計數推薦一篇部落格,【科技】三元環計數,很詳細,很清楚。

每乙個三元環之所以被算了一次,是因為乙個三元環在新圖上必定只有乙個點的出度為2,然後我們只在這個點上更新三元環數量。

然後我放了個**:

#define fore(i, x, y) for(int i = head[x], y; (y = e[i].to) && ~i; i = e[i].nxt)

in bool dcmp(int x, int y)

in void calc_3()

}

四元環計數網上好想找不到,抄了神仙的**自己腦補了一下。

還是將圖按上述規則轉化成有向無環圖,然後對於每乙個點$x$,遍歷他在新圖上的出邊,即走到的點為$y$,再遍歷$y$在**原圖**和$y$相鄰的點$z$,然後用上面**的dcmp函式判斷$x, z$,如果成立,說明找到了四元環的一半,那麼用$z$上已經記錄的「半個」四元環個數更新$x, y, z$,然後在$z$上記錄這又多了乙個「半個」四元環。

但這樣會導致先找到的「半個」四元環沒有和後面的「半個」四元環匹配上,因此我們還要按上述方法再遍歷一遍$x, y, z$,同時更新每乙個節點上的四元環數量。

按這種方法遍歷一定會保證每乙個四元環只被算過一次,但證明我還是沒太想明白。

in void calc_4()

fore(i, x, y) if(dcmp(x, y))

fore(j, y, z) if(dcmp(x, z)) cir4[y] += (--cnt[z]);

}}

三元環計數

也許更好的閱讀體驗 給一張 n 個點,m 條邊的簡單無向圖,求解有多少個三元環 三元環 乙個三元組 left i,j,k right 表示三個點,要求存在邊 left i,j right left i,k right left j,k right 我們先把每個點 i 定義乙個雙關鍵字 left de...

三元環計數

參考部落格 洛谷模板 無向圖三元環計數 將無向圖轉化成有向圖,度大的指向度小的,若度一樣,按照編號排序。列舉每個點x,將x的所有相鄰點標記,然後列舉x的相鄰點y,再列舉y的相鄰點z,如果z已經被標記,那麼 x,y,z 就是如圖示的三元環。複雜度 o n sqrt n includeusing nam...

Hdu 6184 三元環計數

題目描述 給乙個2e5點2e5邊的無向圖,求子圖 的數量。hint 考慮把所有邊定向,從度數小的點往度數大的點連,這樣每個點的出度都小於sqrt 2e5 include using namespace std typedef long long ll const int maxn 200007 in...