m sqrt m 暴力三元環 hdu 6184

2021-08-07 15:45:50 字數 1166 閱讀 5573

一道賽場上讀錯題意的題。。。

傳送門:

題意:

給一張圖,問能組成多少個,以同一條邊構成的兩個三元環(就是類似四邊形,然後連一條對角線)。

思路:

聽說叉姐的camp的第一場有m*sqrt(m)得方法。沒去看camp血虧啊orz。

暴力列舉每一條邊(也就是列舉兩個端點x,y,先列舉x再列舉y,列舉x的時候可以記錄一下x可到達的z點)。

對於第三個端點,如果後列舉的端點y的邊數要小於sqrt(m),則列舉它。

否則列舉前乙個端點x的第三個端點。

這樣做的極端情況。

對於第一種列舉端點y的第三個端點z。由於前面列舉x的時候,已經順帶的把x和y的關係已經記錄下來了,且因為滿足小於sqrt(m),所以時間複雜度為m * sqrt(m)。

對於第二種列舉端點x的第三個端點z,最差的情況下為完全圖。題目給的邊數是2*10^5。sqrt一下最多也就100+個點。也是sqrt(m) * sqrt(m) * sqrt(m) 再上多個set的查詢log(m)。

且這種情況數較少。所以複雜度差不多能約為m * sqrt(m)。如果第一種情況也用set來找的話,會給卡常數。

#include 

#define maxn 100005

#define ll long long

using

namespace

std;

vector

e[maxn];

bool mark[maxn];

set st;

int link[maxn];

ll cal(ll a)

void init()

st.clear();

}void addedge(int u, int v)

int main()

ll ans = 0;

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

for (int j = 0; j < e[x].size(); j++)

if (e[y].size() <= b)

}} else }}

ans += cal(sum);}}

printf("%lld\n", ans);

}}

Hdu 6184 三元環計數

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

三元環計數(HDU 6104)

這個三元環計數就是去計算圖裡面有多少個三元環。計算這個數目在有的題目裡面有很重要的作用。看了一些部落格後總結一下。有錯誤望指正 1.三元環 三元環就是圖中所示的樣子 2.如何判斷是三元環?三元環現實中我們一下就可以判斷出來,但是競賽中要怎麼判斷呢?我們都知道一句話 敵人的敵人就是我們的朋友,對三元環...

三元環 四元環計數

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