動態規劃 樹 JZOJ 3738 理想城市

2021-09-26 02:13:00 字數 1649 閱讀 9450

在乙個方格圖上有若干個小格,其中滿足小格互相連通,且不是空格也互相連通。

求小格兩兩之間的最短路的總和。

暴力30

3030

分很好打,但是後面列舉小格一定是o(n

2)

o(n^2)

o(n2

)的,所以我們考慮別的做法。

根據圖的性質,我們可以把橫著連通小格縮成乙個點,將相鄰的小格的點連邊。可以發現,一條連線(u,

v)

(u,v)

(u,v

)的邊對答案的貢獻為siz

e[v]

∗(n−

size

[v])

size[v]*(n-size[v])

size[v

]∗(n

−siz

e[v]

),其中siz

e[v]

size[v]

size[v

]為以v

vv為根的所有點中小格數量的總和。

對於點中的小格的距離,只用再把豎著的小格縮點做一遍就可以了。

#include

#include

#include

#include

#include

#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)

const

int p =

1000000000

;struct node a[

100001];

std::map<

int,

int> h;

int n, sx, sy, tot, ans;

int head[

100001

], next[

200001

], ver[

200001

], be[

100001

], size[

100001];

bool

operator

<

(const node &a,

const node &b)

intid

(int x,

int y)

void

add(

int u,

int v)

void

init()

int k = h[

id(x +

1, y)];

if(k)

add(be[i]

, be[k]),

add(be[k]

, be[i]);

}}voiddp(

int u,

int fa)

for(

int i = head[u]

; i; i = next[i])if

(ver[i]

!= fa) ans =

(ans +

(long

long

)(n - size[ver[i]])

* size[ver[i]])

% p;

}int

main()

動態規劃 JZOJ 1758 過河

給出n nn根柱子,每根柱在0 00時刻沉下去,然後有a aa個時間單元浮上來,b bb個時間單元沉下去,再有a aa個時間單元浮上來,b bb個時間單元沉下去,等等。在t 1 t 1t 1時刻,市民可以選擇距離t時刻所在位置5 55根柱子之內的可靠的柱子上 岸上,或者站在當前的柱子上 如果可靠 或...

動態規劃 貪心 JZOJ 4249 遊戲

乙個人從起點0 00出發。他現在如果在i ii,那麼如果跳到j jj,那麼獲得的價值為 j i a j j i a j j i aj 求剛好落到終點n nn的最大可獲得的價值。剛開始看到就想到o n 2 的d po n 2 的dp o n2 的 dp,結果看了下資料發現只能拿60 6060 分,正解...

jzoj4887 最大匹配 樹形動態規劃

求出一棵樹的最大匹配和方案。樹形dp,f i 0,1 表示i有沒選的最大匹配,順便記錄方案數。考慮選i的情況,要在兒子中找到乙個沒選的,統計一下方案數。include include include define ll long long define min a,b ab a b define f...