NOI2014 魔法森林

2022-03-27 03:53:54 字數 1291 閱讀 3769

題目

首先這道題的生成樹部分還是比較好想的,如果只有\(a\)或\(b\)乙個限制,那麼我們求乙個最小生成樹最小化最大邊權

有兩個限制的話我們先對\(a\)求出最小生成樹,考慮把沒有加入最小生成樹的邊加進去,顯然會使得\(1\)到\(n\)之間最大的\(b\)變小,就把剩下的邊一條一條加進去,維護出\(1\)到\(n\)之間的最大邊權

\(lct\)維護的是點的資訊,處理邊權的話我們不能像樹剖那樣把一條邊的資訊存在乙個兒子裡,因為樹的結構時刻在變化,所以我們得把每一條邊當成

#include#include#include#include#define maxn 1500005

#define re register

#define inf 999999999

#define ll long long

#define max std::max

#define min std::min

#define pt putchar(1)

inline int read()

int n,m,ans;

struct e e[maxn];

inline int cmp(e a,e b)

int ch[maxn][2],rev[maxn],fa[maxn],d[maxn],st[maxn];

inline int nroot(int x)

inline void pushup(int x)

inline void pushdown(int x)

inline void rotate(int x)

inline void splay(int x)

//putchar(10);

}inline void access(int x)

inline void makeroot(int x)

inline int findroot(int x)

inline void split(int x,int y)

inline void link(int x,int y)

inline void cut(int x,int y)

int main()

if(findroot(m+1)==findroot(n+m))

split(m+1,n+m),ans=min(ans,e[i].a+e[d[n+m]].b);

}if(ans!=inf) printf("%d\n",ans);else puts("-1");

return 0;

}

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