一道賽場上讀錯題意的題。。。傳送門:
題意:
給一張圖,問能組成多少個,以同一條邊構成的兩個三元環(就是類似四邊形,然後連一條對角線)。
思路:
聽說叉姐的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...