SDOI2010 魔法豬學院

2021-10-04 18:34:01 字數 2116 閱讀 7839

點此看題

直接講人話把,網上的什麼性質和結論看得我想吐。

首先建出以t

tt為根的最短路樹,在反圖上跑最短路然後建樹,多條滿足條件的邊任選即可。

我們考慮用非樹邊替換樹邊,定義一條邊(u,

v)

(u,v)

(u,v

)的權值是 c−d

is[u

]+di

s[v]

c-dis[u]+dis[v]

c−dis[

u]+d

is[v

] (dis

disdi

s為樹上的到根的距離,c

cc是壁邊權),實際意義就是選擇這條邊多出來的距離,顯然任意權值都是非負的。從1

11開始跑乙個優先佇列,選擇某乙個祖先(或自身)最小權值,優先佇列有兩種擴充套件方式,第一種是用當前的次小權值替換最小權值,第二種是跑到最小權值邊鏈結的地方選擇那裡的最小權值開始跑,這樣就會一直擴充套件到k

kk短路了。

分析上面的問題,不難發現我們要使用堆,但是我們需要的祖先(或自身)的最小權值,就需要從祖先一路合併下來,故要用左偏樹,祖先和自身的權值都可能被用到,我們不能改變左偏樹的結構,所以要用可持久化左偏樹。其實可持久化左偏樹的思路很簡單,在合併的時候不修改x

xx的右兒子而是直接新建節點,這樣就保證的樹的形態不變。

時間複雜度&

\&&空間複雜度o(m

log⁡m)

o(m\log m)

o(mlogm)

,貼個**qwq

qwqqw

q。

#include

#include

#include

using

namespace std;

#define eps 1e-8

const

int m =

200005

;int

read()

int n,m,tot,cnt,ans,f[m]

,vis[m]

,rt[m]

,cov[

2*m]

,fa[m]

;double s,c,dis[m]

;struct edgee[2

*m];

struct data

t[20

*m];

struct node

};priority_queue q;

double

abs(

double x)

void

dfs(

int u)

}int

merge

(int x,

int y)

signed

main()

,f[u]

=tot;

e[++tot]

=edge

,f[v]

=tot;

} dis[n]=0

;q.push

(node);

while

(!q.

empty()

));}

}for

(int i=

1;i<=n;i++

) vis[i]=0

;dfs

(n);

for(

int i=

2;i)if

(!cov[i]

)for

(int i=

1;i<=n;i++

) q.

push

(node);

for(

int i=

1;i<=n;i++

) s-

=dis[1]

;ans++;if

(rt[1]

) q.

push

(node);

while

(!q.

empty()

));}

if(rt[t[x]

.ed]

) q.

push

(node);

}printf

("%d\n"

,ans)

;}

SDOI2010 魔法豬學院

感謝 kczno1 x o r 提供hack資料 ipig在假期來到了傳說中的魔法豬學院,開始為期兩個月的魔法豬訓練。經過了一周理論知識和一周基本魔法的學習之後,ipig對豬世界的世界本原有了很多的了解 眾所周知,世界是由元素構成的 元素與元素之間可以互相轉換 能量守恆 能量守恆 ipig 今天就在...

SDOI2010 魔法豬學院(K短路)

ipig在假期來到了傳說中的魔法豬學院,開始為期兩個月的魔法豬訓練。經過了一周理論知識和一周基本魔法的學習之後,ipig對豬世界的世界本原有了很多的了解 眾所周知,世界是由元素構成的 元素與元素之間可以互相轉換 能量守恆 能量守恆 ipig 今天就在進行乙個麻煩的測驗。ipig 在之前的學習中已經知...

模板篇 k短路 SDOI2010 魔法豬學院

都成了一道模板題了ovo 不想看的自行點目錄 今天才發現自己還沒有學a 就去看了一下a 尋路,但是只看也不行啊,得找題練一練啊.然後上luogu搜a 演算法結果找到了這道題?但這不應該是道圖論麼 然後看了看題解發現原來是最短路預處理然後a 那就寫嘛,寫的有模有樣的大約30min?然後過了樣例,交上去...