此題可以用spfa,也可以用lct。
可spfa跑得比lct快……
學習了一下怎麼把邊權變成點權:
新建乙個點表示邊,這個點的點權就是邊權值
原來的點的權值為0(根據題目需要可以為其他值)
新增一條邊時,連線兩端的點
刪除一條邊時,需要找到這條邊對應的點編號,兩端刪除
#include
#include
#include
using
namespace std;
struct node
} edge[
100005];
int fa[
50005];
int val[
150005
],mx[
150005
],po[
150005];
int ch[
150005][
2],fa[
150005];
bool reversed[
150005];
int sta[
150005
],top;
int n,m,ans=
1e9;
inline
intread()
intfind
(int x)
inline
void
union
(int x,
int y)
inline
void
reverse
(int x)
inline
void
pushdown
(int x)
}inline
void
pushup
(int x)
inline
bool
notroot
(int x)
inline
void
rotate
(int x)
inline
void
splay
(int x)
rotate
(x);}}
inline
void
access
(int x)
}inline
void
makeroot
(int x)
inline
intfindroot
(int x)
inline
void
split
(int x,
int y)
inline
void
link
(int x,
int y)
inline
void
cut(
int x,
int y)
}inline
void
addedge
(int i)
else}}
intmain()
sort
(edge+
1,edge+m+1)
;for
(int i=
1;i<=n;i++
) fa[i]
=po[i]
=i;for
(int i=
1;i<=m;i++)}
if(ans==
1e9)
puts
("-1");
else
printf
("%d"
,ans)
;return0;
}
NOI2014 魔法森林
為了得到書法大家的真傳,小e同學下定決心去拜訪住在魔法森林中的隱士。魔法森林可以被看成乙個包含個n節點m條邊的無向圖,節點標號為 1 n 邊標號為1 m 初始時小e同學在 1 號節點,隱士則住在 n 號節點。小e需要通過這一片魔法森林,才能夠拜訪到隱士。魔法森林中居住了一些妖怪。每當有人經過一條邊的...
NOI2014 魔法森林
為了得到書法大家的真傳,小 e 同學下定決心去拜訪住在魔法森林中的隱士。魔法森林可以被看成乙個包含 n 個節點 m 條邊的無向圖,節點標號為1,2,3,n,邊標號為 1,2,3,m。初始時小 e 同學在 1 號節點,隱士則住在 n 號節點。小 e 需要通過這一片魔法森林,才能夠拜訪到隱士。魔法森林中...
NOI2014 魔法森林
noi2014 魔法森林 要求a 與 b 的總和最小 可以按a排序 再以b為權值維護一顆樹 lct維護最小生成樹 要解決的問題 將每一條邊變為乙個點 邊權變為點權 舉個栗子 u v有一條邊權為w的邊 怎lct連邊方式為 u new v new的點權為w 不斷維護最小生成樹 如果新加入的邊的 u與v不...