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...