NOI2014 魔法森林

2021-08-20 08:39:17 字數 1874 閱讀 7431

此題可以用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不...