NOI2014 魔法森林

2022-05-31 07:12:07 字數 1155 閱讀 9770

題解:

lct維護生成樹

首先先把a按照權值從小到大排序

然後維護路徑間b的最小值(其實就是滿足樹的性質)

如果這兩點之間連邊了,我們就找到其中的最大邊,判斷一下他和當前點的大小關係

邊權變成點權處理就可以了

**:

#include using

namespace

std;

#define n 200000

struct

rea[n*2

];int

v[n],data[n],data2[n],n,m;

intleftson[n],rightson[n],fa[n];

bool

rev[n];

bool

cmp(re x,re y)

void updata(int

x)void down(int

x)bool pd(int

x)void rotate(int x,inty)

else

fa[x]=fa[father];

if(pd(father))

if (y==1) leftson[x]=father;

else rightson[x]=father;

fa[father]=x;

updata(father); updata(x);

}void dfs(int

x)void splay(intx)

else

father=fa[x];

}}void access(int

x)void makeroot(int

x)int findroot(int

x)void split(int x,int

y)bool find(int x,int

y)void link(int x,int

y)void cut(int x,inty)}

intmain()

} else

if (find(1

,n))

}if (ans==1e9) cout<<-1

;

else cout

}

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不...