點此看題
直接講人話把,網上的什麼性質和結論看得我想吐。
首先建出以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
logm)
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?然後過了樣例,交上去...