點分治 統計長度為K的路徑條數

2021-07-02 01:03:30 字數 1066 閱讀 5707

套用第一種點分治模板——先加後減法。

計算過程略微不同,得到deep陣列後,計算和為k的路徑對數

1.剔除d[i]+d[i]==k的情況

2.遍歷一遍後,每種情況計算了兩次,最後需要除2

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define mp make_pair

#define mp(x,y) make_pair((x),(y))

#define x first

#define y second

#define oo 0x3f3f3f3f

const ll inf = 0x0fffffffffffffff;

using

namespace

std;

typedef

long

long lld;

const

int maxn = 10000+10;

int n,k;

typedef pair f;

vector

e[maxn];

int s[maxn],deep[maxn],d[maxn],ans;

bool vis[maxn];

void add(int u,int v,int w)

f getcore(int u,int f,int sum)

lar=max(lar,sum-s[u]);

ans=min(ans,mp(lar,u));

return ans;

}void build()

}}void getdeep(int u,int f)

}int cal(int u,int w)

void work(int u,int f,int sum)

}int main()

printf(".\n");

}}

基於鄰接表的長度為k的簡單路徑的求解

描述 乙個連通圖採用鄰接表作為儲存結構。設計乙個演算法,判斷無向圖中任意給定的兩點是否存在一條長度為k的簡單路徑。輸入多組資料,每組m 3資料行。第一行有兩個數字n,m和k,代表有n個頂點,m條邊和長度k。第二行有n個字元,代表n個頂點的編號。第三行到第m 2行每行有兩個字元h和p,代表邊依附的兩個...

bzoj3697 採藥人的路徑 點分治

一道拖了很久的點分治,現在把他搞定了。來自出題人hta的題解 本題可以考慮樹的點分治。問題就變成求過根滿足條件的路徑數。路徑上的休息站一定是在起點到根的路徑上,或者根到終點的路徑上。如何判斷一條從根出發的路徑是否包含休息站?只要在dfs中記錄下這條路徑的和x,同時用個標誌陣列判斷這條路徑是否存在字首...

bzoj3697 採藥人的路徑 (點分治)

原題位址 題意 採藥人的藥田是乙個樹狀結構,每條路徑上種植一種藥,有0 1兩種藥。草藥人希望選擇一條兩種藥材數目相等的路徑,且選出的路徑中有乙個可以作為休息站的節點 不包括起點和終點 滿足起點到休息站和休息站到終點的路徑也是兩種藥數量相等。他一共可以選擇多少種不同的路徑。資料範圍 n 100,000...