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 時,...