NOI2014魔法森林 LCT

2021-07-26 06:52:53 字數 1661 閱讀 4655

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

魔法森林中居住了一些妖怪。每當有人經過一條邊的時候,這條邊上的妖怪就會對其發起攻擊。幸運的是,在 11 號節點住著兩種守護精靈:a型守護精靈與b型守護精靈。小e可以借助它們的力量,達到自己的目的。

只要小e帶上足夠多的守護精靈,妖怪們就不會發起攻擊了。具體來說,無向圖中的每一條邊 eiei 包含兩個權值 aiai 與 bibi。若身上攜帶的a型守護精靈個數不少於 aiai,且b型守護精靈個數不少於 bibi,這條邊上的妖怪就不會對通過這條邊的人發起攻擊。當且僅當通過這片魔法森林的過程中沒有任意一條邊的妖怪向小e發起攻擊,他才能成功找到隱士。

由於攜帶守護精靈是一件非常麻煩的事,小e想要知道,要能夠成功拜訪到隱士,最少需要攜帶守護精靈的總個數。守護精靈的總個數為a型守護精靈的個數與b型守護精靈的個數之和。

輸入格式

第1行包含兩個整數 n,mn,m,表示無向圖共有 nn 個節點,mm 條邊。

接下來 mm 行,第 i+1i+1 行包含4個正整數 xi,yi,ai,bixi,yi,ai,bi,描述第 ii 條無向邊。其中 xixi 與 yiyi 為該邊兩個端點的標號,aiai 與 bibi的含義如題所述。

注意資料中可能包含重邊與自環。

分析:

因為要解決a,b兩個花費的問題,因此我們的想法是先確定乙個變數,即按a之進行排序,再依次地加邊。當出現環時查詢環上的最大邊權,再考慮是否加進去。加邊/刪邊利用lct。

另外的乙個問題是,動態樹維護邊並不是那麼的方便,因此我們的做法是對於每一條邊,建乙個點權為這條邊權的新點,它連線原來那條邊的兩端點。

注意:

rotate是乙個及其容易錯的地方(我至少已經錯了三次了,而且每一次都花了較長時間除錯,一定要小心一點!)。

#include

#include

#include

#include

using namespace std;

const

int maxn=150010;

const

int maxm=100010;

int n,m;

struct edge

bool isroot(int x)

void push_up(int x)

void push_down(int x)

}void push(int x)

void rotate(int x)

void splay(int x)

rotate(x);

}push_up(x);

}void access(int x)

}void setroot(int x)

void link(int x,int y)

void add(int i)

void cut(int x)

void remove(int x)

int query(int x,int y)

int main()

printf("%d\n",ans<1e8?ans:-1);

return

0;}

NOI2014 魔法森林 LCT

為了 得到書法大家的真傳,小e同學 下定決心去 拜訪住在 魔法森林中的 隱士。魔法森林 可以被看成乙個 包含個n節點m條邊的無向圖 節點標號為1.n 邊標號為1.m 初始時 小e同學在 號節點1 隱士則 住在號節點n 小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做一次最小生成樹。...