d.
题目类型:状态压缩,最短路
题目大意:给出一个图n个点、m条边以及每条边的权。Money有一个初始值。在图上需要遍历p个节点,到达Ui(1<=i<=p)时,先Money减少Di,然后增加Ci。任何Money不能为负。从U1出发,最后要回到U1.(U1可能是p个点中的,也可能不是),问能否完成遍历。
题目解法:
dp[u][p1][p2]...[pu]...[pn] = min(dp[i][p1][p2]...[pi - 1]...[pn] + dis(i, u)),i为当前所在的必经节点,p1 ~ pn为pi是否遍历过的bool值,因为 p <= 15,p1 ~ pn压缩进1 ~ 2 ^ 15的二进制整数,状态为dp[u][v] = min(dp[i][j & (1 << i) == 0 ? j - (1 << i) : j] + dis(i, u)),然后跑最短路。
注意细节:
由于short的范围是[- 2 ^ 15, 2 ^ 15 - 1]表示V的值并不能用short而要用int。
e.
题目类型:树的点分治
题目大意:给出一个树,求有多少条不相交的路径。
题目解法:
枚举一个路径的中垂点u,中垂点的定义是离另一条路径的最近点,然后计算从这点出发的路径数,N * (N - 1) * (N * (N - 1) - 1) - f(root); f(u) = [v] + [v] * f(v),(u, v) ∈ E;重路径对数减去相交路径对数。