XSY3888 傳送門(最短路樹,可並堆,dp)

2022-05-20 16:40:34 字數 3538 閱讀 9903

假設 s

ss 到 t

tt 路徑上一條邊 (u,

v)(u,v)

(u,v

) 被刪掉之後最短路會如何變化。

建出以 t

tt 為根的最短路樹,如果 (u,

v)(u,v)

(u,v

) 不在樹上,那麼我們直接從 u

uu 沿著最短路樹走到 t

tt 即可。

否則,如果 (u,

v)(u,v)

(u,v

) 在最短路樹上,那麼 v

vv 一定是 u

uu 的父親。那麼我們需要從 u

uu 走到 u

uu 子樹內的任意乙個點 x

xx,然後再從 x

xx 經過一條非樹邊跳到乙個在 u

uu 子樹外的點 y

yy,然後再沿最短路樹走到 ttt。

類似這樣:

(其中黑色虛線邊表示的是非樹邊,紅叉邊表示被刪掉的邊,藍色表示路徑)

設 d is

udis_u

disu

​ 表示最短路樹上 t

tt 到 u

uu 的路徑長。考慮如何維護上面藍色路徑的最小值。把這段路程表示出來:

d is

x−di

su+w

(x,y

)+di

sydis_x-dis_u+w_+dis_y

disx​−

disu

​+w(

x,y)

​+di

sy​

那麼我們直接維護 dis

x+w(

x,y)

+dis

ydis_x+w_+dis_y

disx​+

w(x,

y)​+

disy

​ 的最小值即可。

對於每乙個點 u

uu,用堆維護其子樹內 dis

x+w(

x,y)

+dis

ydis_x+w_+dis_y

disx​+

w(x,

y)​+

disy

​ 的最小值。

合併的時候用左偏樹即可。

最多合併 n−1

n-1n−

1 次(n−1

n-1n−

1 條邊),所以維護這個的過程時間不會超過 o(n

log⁡n)

o(n\log n)

o(nlogn)

。不妨設 g

ug_u

gu​ 表示刪掉邊 (u,

fau)(u,\textit_u)

(u,fau​

) 之後到達 t

tt 的最小值。(g

ug_u

gu​ 通過上面的過程求出)

令 d pu

dp_u

dpu​

表示 s=u

s=us=

u 時的答案,用 v

vv 更新 u

uu 時的轉移為:

d pu

=min⁡(

u,v)

(max⁡(

dpv+

w(u,

v),\left(\max\left(dp_v+w_, \beging_u&v=\textit_u\\dis_u&v\neq \textit_u\end\right)\right)

dpu​=(

u,v)

min​

(max(d

pv​+

w(u,

v)​,

;data

(int a,

int b)

bool

operator

<

(const data &a)

const};

struct heap//左偏樹

else now=

++node;

to[now]

=y,val[now]

=v;return now;

}int

merge

(int x,

int y)

intpop

(int u)

}heap;

int n,m;

int cnt,head[n]

,nxt[m<<1]

,to[m<<1]

,w[m<<1]

;int dis[n]

,fa[n]

;int idx,dfn[n]

,size[n]

;int root[n]

;int dp[n]

,g[n]

;bool vis[n];

vector<

int>e[n]

;priority_queueq;

void

adde

(int u,

int v,

int wi)

void

dijkstra()

}}}void

dfs(

int u)

for(

int i=head[u]

;i;i=nxt[i]

)while

(root[u]

&&intree

(heap.to[root[u]

],u)

) root[u]

=heap.

pop(root[u]);

if(root[u]

) g[u]

=heap.val[root[u]

]-dis[u];}

voiddp(

)}}}

intmain()

dijkstra()

;for

(int i=

1;i) e[fa[i]].

push_back

(i);

dfs(n)

;// puts("i didn't mle!!!");

// return 0;dp(

);if(dp[1]

!=dp[0]

)printf

("%d\n"

,dp[1]

);else

puts

("-1");

return0;

}/*5 10

1 3 10

1 5 4

3 4 6

5 2 10

1 2 6

4 5 2

2 3 2

4 1 5

4 2 6

5 3 3

*/

八 傳送郵件

傳送郵件 如下 from email.mime.text import mimetext from email.header import header import smtplib import datetime from poseidon.myutil import myutil import ...

5 傳送模板訊息

詳情參看 傳送模板訊息 介面呼叫請求說明 http請求方式 post post資料示例如下 data keynote1 keynote2 keynote3 remark createmunu url,params string url send template url.replace access...

SprongBoot傳送郵件(三)傳送附件郵件

還是在 sprongboot傳送郵件 一 傳送簡單文字郵件helloworld 的配置基礎上新增如下 param to param subject param content param filepath 檔案路徑 throws messagingexception public void send...