POJ 1741 點分治入門

2021-10-12 09:59:54 字數 1207 閱讀 2636

tree

其實關於時間複雜度我也似懂非懂,大概就是把一顆樹分層,然後每一層的操作大概是(n log n),然後我們每次找樹的重心,就可以分logn層,所以總時間複雜度大概是就是n log² n

關於路徑,我們先算出到根的距離,然後分成兩種,一種關於經過n節點,這是合法的,一種是不經過根節點,就是在一根子樹下的,我們可以先算根節點的所有情況,再計算孩子節點的情況,然後減掉就好了。

然後計算路徑用尺取就好了。

#define _crt_secure_no_warnings

#include

#include

#include

#include

using namespace std;

#define ll long long

const

int maxn =

10100

;const ll mod =

1e9+7;

const ll inf =

1e15

;struct node

e[maxn <<2]

;int head[maxn]

, cnt, ans;

int dist[maxn]

, vis[maxn]

, mx[maxn]

, son[maxn]

;int mini, root, num, n, k;

void

add(

int u,

int v,

int val)

void

dfssize

(int u,

int fa)

}void

dfsroot

(int r,

int u,

int fa)

}void

dfsdist

(int u,

int d,

int fa)

}int

cal(

int t,

int d)

return res;

}void

dfs(

int u)}}

intmain()

dfs(1)

;printf

("%d\n"

, ans);}

return0;

}

poj1741點分治入門題

include include include include define n 40005 define m 80005 define ll long long using namespace std const int inf 0x3f3f3f3f int ver m edge m head n...

POJ 1741 點分治詳解

題意 給出乙個n 1e4 個點的樹,每條邊有權,求樹上長度小於等於k的路徑條數。u,v 和 v,u 算兩條。點分治 顧名思義,點分治就是對點進行分治,一般用於路經統計問題。對每個點而言,一條路徑要麼經過他,要麼不經過他,這就是分,即分成路徑經過此點和不經過此點。基本思想是 當經過某點的路徑可以比較方...

POJ1741 點分治模板

傳送門 求樹上兩點間路徑長度小於k的點對個數 參考資料 守望的澱粉質略解 粉紅兔大佬的澱粉質 演算法步驟 計算重心位置 計算答案 分治子問題繼續求解 1 3 include include include include include include include include include...