為了
得到書法大家的真傳,
小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做一次最小生成樹。...