POJ 6184 三元環 分治

2021-08-07 19:19:25 字數 1136 閱讀 7879

poj6184入口

題意: 給一張圖,n(n<1e5),個點,m(m<2e5)條邊,問能組成多少個,以同一條邊構成的兩個三元環。

思路:暴力列舉每一條邊(兩端點設為x,y)

然後列舉第三個點z。

1.當du[y]<=sqrt(m),用lik記錄所有與x相連的邊。然後列舉與y相連的點z,判斷z是否與x相連。演算法時間m*(sqrt(m))。

2當du[y]>sqrt(m) ,列舉與x相連的點z,用二分在y中查詢z(可以用set,耗時比二分多),每次查詢時間log(g[y].size()).,由於這種點很少。每次時間與x相連的點數*log(與y相連的點數)

對於每條邊列舉的三元環k,答案加上每個c(2,k)。

最終時間大概和m*log(m)。

分治。(在poj上提交 最優577ms,平均700ms,最差少於900ms)

accode

#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;

const int n=100005;

vectorg[n];

int n,m,du[n],lik[n];

bool vis[n];

ll ans,kk;

int main()

for(int i=1;i<=m;i++)

for(int i=1;i<=n;i++)sort(g[i].begin(),g[i].end());

for(int i=1;i<=n;i++)

for(int i=1;i<=m;i++)

for(int i=1;i<=n;i++)

sort(g[i].begin(),g[i].end());

int x,y,xi,yi,z;

for(int i=1;i<=m;i++)

{x=a[i];y=b[i];

xi=0;

yi=0;

k=0;

if(du[y]<=b&&du[x]<=b)

while(xig[y][yi])

yi++;

else if(g[x][xi]

Hdu 6184 三元環計數

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

m sqrt m 暴力三元環 hdu 6184

一道賽場上讀錯題意的題。傳送門 題意 給一張圖,問能組成多少個,以同一條邊構成的兩個三元環 就是類似四邊形,然後連一條對角線 思路 聽說叉姐的camp的第一場有m sqrt m 得方法。沒去看camp血虧啊orz。暴力列舉每一條邊 也就是列舉兩個端點x,y,先列舉x再列舉y,列舉x的時候可以記錄一下...

三元環 四元環計數

這東西其實就是一種暴力,只不過巧妙的是每乙個環恰好統計了一次。三元環計數推薦一篇部落格,科技 三元環計數,很詳細,很清楚。每乙個三元環之所以被算了一次,是因為乙個三元環在新圖上必定只有乙個點的出度為2,然後我們只在這個點上更新三元環數量。然後我放了個 define fore i,x,y for in...