NOI2014 魔法森林 LCT

2021-07-25 14:43:31 字數 2305 閱讀 1662

為了

得到書法大家的真傳,

小e同學

下定決心去

拜訪住在

魔法森林中的

隱士。魔法森林

可以被看成乙個

包含個n節點m條邊的無向圖

,節點標號為1..n

,邊標號為1..m

。初始時

小e同學在

號節點1

,隱士則

住在號節點n

。小e需要通過這一片魔法森林,才能夠拜訪到隱士。

魔法森林

中居住了

一些妖怪。每當有人

經過一條邊

的時候,這

條邊上的妖怪就會

對其發起

攻擊。幸運

的是,在號

節點住著兩種守護精靈

:a型守護精靈與b型守護精靈

。小e可以借助

它們的力量

,達到自己的目的。只要

小e帶上足夠多的守護精靈,

妖怪們就不會發起攻擊

了。具體來說

,無向圖中的

每一條邊

ei包含

兩個權值ai

與bi。若身上

攜帶的a

型守護精靈

個數不少於ai

,且b型守護精靈個數

不少於bi

,這條邊上的妖怪

就不會對

通過這條邊

的人發起攻擊

當且僅當

通過

魔法森林

的過程中沒有

任意一條邊

妖怪

小e發起攻擊

他才能成功

找到

隱士。

由於攜帶守護精靈是一件非常

麻煩的事,小e想要知道,

要能夠成功拜訪到隱士,最少

需要攜帶守護精靈

的總個數

守護精靈

總個數

為a型守護精靈的個數與b型守護精靈的個數之和。

分析:將邊轉點,向u v連邊,然後按邊的a值排序,依次將邊加入維護乙個動態森林,如果出現環那麼把原環上的最大邊刪去然後更新答案,因為一開始刪錯了邊wa了一下午。。

#include#include#include#include#include#include#include#include#include#include#include#define inf 2147483640

#define eps 1e-9

#define maxn 200010

using namespace std;

struct edg

}edg[maxn];

int n,m,ans,f[maxn],s[maxn],ch[maxn][2],value[maxn],maxn[maxn],fa[maxn];

bool lazy[maxn];

inline bool isroot(int x)

void push_up(int x)

void rotate(int x)

fa[y] = x,fa[x] = z,fa[ch[x][d^1]] = y;

ch[y][d] = ch[x][d^1],ch[x][d^1] = y;

push_up(y),push_up(x);

}inline void push_down(int x)

void splay(int x)

rotate(x); }}

void access(int x)

}void makeroot(int x) //x變成根

void link(int x,int y)

void cut(int x,int y)

int find(int x)

int main()

else

}if(find(1) == find(n))

}if(ans != inf) cout<

NOI2014魔法森林 LCT

題目 為了得到書法大家的真傳,小e同學下定決心去拜訪住在魔法森林中的隱士。魔法森林可以被看成乙個包含個n節點m條邊的無向圖,節點標號為 1 n1 n,邊標號為1 m1 m。初始時小e同學在 11 號節點,隱士則住在 nn 號節點。小e需要通過這一片魔法森林,才能夠拜訪到隱士。魔法森林中居住了一些妖怪...

NOI2014 魔法森林 LCT

有n個點,m條邊,要使得從1點到n點的 最低要求ai和最低要求bi 的和最小,問最小和。那麼,很顯然的,就是求乙個聯通關係,與最短路無關,因為限制條件不唯一,需要同時限制ai和bi,所以我們不妨列舉一維,然後再是維護一維。我們對a關鍵字進行公升序處理,然後我們維護一棵b關鍵字的最小生成樹,然後列舉這...

NOI2014 魔法森林 LCT維護MST

bzoj3669 題面 從更簡單的情況入手,如果邊權只有 a 沒有 b應該怎麼處理?這時候問題就是找一條從1到n的路徑,使得最長的邊盡量短。根據最小生成樹的性質,這樣的邊一定在最小生成樹上。如果a 固定,得到的解法是一樣的。那麼可以分別討論每乙個 a,對於權值不大於 a 的邊對 b做一次最小生成樹。...