在乙個方格圖上有若干個小格,其中滿足小格互相連通,且不是空格也互相連通。
求小格兩兩之間的最短路的總和。
暴力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...