對於每個葉子節點問:是否能構造出一條從根節點出發以該節點為終點的長為 \(k\) 的路徑
設有乙個葉子節點 \(x\)
情況1根到 \(x\) 的路徑長等於 \(k\)
那顯然答案就是yes
情況2走了一次附加的有向邊使得路徑長為 \(k\)
考慮這條有向邊的終點在**:由於走過這條有向邊之後還要從它的終點走到 \(x\),所以有向邊的終點一定要是 \(x\) 的乙個祖先
記點 \(p\) 的深度是 \(d_p\),那麼假設走了一條 \(p\rightarrow q\) 的有向邊,總長度就是 \(d_p+s+(d_x-d_q)\)
其中,\(p\) 是樹上的任意乙個非葉子節點,\(q\) 必須是 \(x\) 的祖先
要判斷是否有 \(p,q\) 滿足 \(d_p+s+(d_x-d_q)=k\),可以考慮列舉 \(q\),這樣就確定了 \(d_x-d_q\),預處理出 \(d_p+s\) 可以取哪些值(存在乙個bool
陣列裡),如果存在某個 \(p\) 使得 \(d_p+s=k-(d_x-d_q)\) 那麼 \(x\) 的答案就是yes
乙個例子
情況3如果一條有向邊可以走很多次,那麼必須滿足它的終點是起點的祖先
又因為終點要是 \(x\) 的祖先,所以現在需要找到這樣一條路徑 \(p\rightarrow q\):
滿足 \(d_x+t*(d_p-d_q+s)=k\) (\(t\) 為乙個正整數)
其中 \(q\) 是 \(x\) 的祖先,\(p\) 是 \(q\) 子樹中乙個非葉子節點
在dfs時,每到乙個非葉子節點就再把以它為根的子樹遍歷一遍,把所有合法的 \(d_p-d_q+s\) 存在bool
陣列裡,並在回溯時清除貢獻
列舉 \(k-d_x\) 的所有約數,判斷是否有滿足條件的 \(d_p-d_q+s\) 即可
時間複雜度 \(o((n+m)^2+m\sqrt)\)
#include #define n 20005
using namespace std;
typedef long long ll;
template inline void read(t &num)
int n, ccf, k, s, a[n], d[n];
int head[n], pre[n<<1], to[n<<1], sz;
int ok[1000005], ok2[1000005], ans[n];
inline void addedge(int u, int v)
void dfs1(int x, int fa)
} void dfs3(int x, int fa, int rt, int v)
}int stk[n], top;
void solve(int x)
for (int i = 1; i <= top; i++)
if (d[x] < k)
} }}void dfs2(int x, int fa)
stk[++top] = x;
dfs3(x, fa, x, 1);
for (int i = head[x]; i; i = pre[i])
dfs3(x, fa, x, -1);
top--;
}int main()
dfs1(0, 0);
dfs2(0, 0);
for (int i = ccf + 1; i <= n; i++) puts(ans[i]?"yes":"no");
return 0;
}
BOI 2002 雙調路徑
城市的道路是雙向的,每條道路有固定的旅行時間以及需要支付的費用。路徑由連續的道路組成。總時間是各條道路旅行時間的和,總費用是各條道路所支付費用的總和。同樣的出發地和目的地,如果路徑a比路徑b所需時間少且費用低,那麼我們說路徑a比路徑b好。對於某條路徑,如果沒有其他路徑比它好,那麼該路徑被稱為最優雙調...
獲得檔案路徑
1 獲得絕對路徑 eg.c yuanzhenhai littlesea.txt 2 當前相對路徑 eg.littlesea.txt 3 獲得目錄上一層的相對路徑 假如已經知道當前路徑是.littlesea.txt 得到它的上一層路徑yuanzhenhai中的xiaohai.txt路徑的方法是 eg....
HTML檔案路徑
如何表示下級目錄 引用下級目錄的檔案,直接寫下級目錄檔案的 路徑即可。假設info.html 路徑是 c inetpu b wwwroot sites blabla info.html 假設index.html 路徑是 c inetpub wwwroot sites blabla html inde...