bzoj3669 魔法森林 LCT 並查集

2021-07-26 22:55:00 字數 1426 閱讀 9240

ac通道:

【題解】

據說spfa可以說過。。。。。。

lct做法:將邊權按其中乙個值排序,往裡面加邊,用並查集維護圖的連通性,當1與n聯通時更新答案。

用lct維護圖中的另一邊權的最大值,如果邊的兩端不連通直接加入,否則說明構成了環,刪去環上最大的邊。

小技巧:邊可以建成點,向邊的兩端連邊,在該點上維護權值資訊。

ps:sort(e+1,e+m+1)中的m手殘打成n,查了乙個晚上(二分出錯位置**好)。

#include#include#include#include#include#include#includeusing namespace std;

#define file "read"

#define maxn 200010

#define inf 1000000000

#define up(i,j,n) for(int i=j;i<=n;++i)

#define dn(i,j,n) for(int i=j;i>=n;--i)

#define cmax(a,b) a=max(a,b)

#define cmin(a,b) a=min(a,b)

namespace init

inline int read()

while(isdigit(ch))

return x*f;

}}using namespace init;

struct nodee[maxn];

int n,m,ans(inf),f[maxn],v[maxn],q[maxn],fa[maxn],maxx[maxn],vis[maxn],son[maxn][2];

int find(int x)

bool cmp(node a,node b)

void pushdown(int x)

}void rotate(int x)

void splay(int x)

void access(int x)

void reverse(int x)

void linkk(int x,int y)

void cut(int x,int y)

int query(int x,int y)

int main()

else

} else fa[find(x)]=find(y);

v[n+i]=e[i].b; maxx[n+i]=n+i;

linkk(x,n+i); linkk(y,n+i);

if(find(1)==find(n)) cmin(ans,e[i].a+v[query(1,n)]);

} if(ans==inf) puts("-1");

else printf("%d\n",ans);

return 0;

}

bzoj 3669 魔法森林

time limit 30 sec memory limit 512 mb submit 2690 solved 1667 submit status discuss 為了得到書法大家的真傳,小e同學 下定決心去 拜訪住在 魔法森林中的 隱士。魔法森林 可以被看成乙個 包含個n節點m條邊的無向圖 節...

刷題總結 魔法森林(bzoj3669)

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

3669 Noi2014 魔法森林 LCT

這一定是我今天犯sb錯誤最多的一道題qaq 先說一下做法吧 這個題有兩個限制條件,a i 和b i 如果只有乙個的話,我們可以直接做mst或者二分答案。兩個該怎麼做呢?依然這樣考慮,我們按照a i 的權值來做mst,逐漸加邊的過程中,a是遞增的,所以我們要維護的是b的最大值。如果加入邊 u,v 時,...