NOI2014 魔法森林

2021-08-16 10:02:17 字數 1144 閱讀 5851

[noi2014]魔法森林

要求a 與 b 的總和最小 可以按a排序 再以b為權值維護一顆樹 lct維護最小生成樹

要解決的問題

將每一條邊變為乙個點 邊權變為點權 舉個栗子: u->v有一條邊權為w的邊 怎lct連邊方式為 u->new->v new的點權為w

不斷維護最小生成樹 如果新加入的邊的 u與v不連通 直接加 如果連通 求u到v路上的最大邊權邊 將它切掉(其實是切兩條邊)再加邊

邊權為b

#include 

#include

#include

using namespace std;

const int maxn=100000+10;

int n,m,blow;

int ans=0x7fffffff;

struct node1

t[maxn*10];

int getson(int x)

void update(int x)

if(t[x].ch[0] && t[x].max1}void rotate(int x)

void pushreverse(int x)

void pushdown(int x)

}void push(int x)

void splay(int x)

}void access(int x)

}void mroot(int x)

int findroot(int x)

void link(int x,int y)

void cut(int x,int y)

int solve(int x)

else

}xx=findroot(1),yy=findroot(n);

if(xx!=yy) return -1;

mroot(1); access(n); splay(n);

return

t[n].max1;

}int main()

for(int i=1; i<=m; i++)

sort(edge+1,edge+m+1);

bool flag=false; blow=1;

for(int i=1; i<=m; i++)

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 魔法森林

此題可以用spfa,也可以用lct。可spfa跑得比lct快 學習了一下怎麼把邊權變成點權 新建乙個點表示邊,這個點的點權就是邊權值 原來的點的權值為0 根據題目需要可以為其他值 新增一條邊時,連線兩端的點 刪除一條邊時,需要找到這條邊對應的點編號,兩端刪除 include include incl...