套用第一種點分治模板——先加後減法。
計算過程略微不同,得到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...