//#include <bits/stdc++.h>
#include<stdio.h>
#include<string.h>
#include<string>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<vector>
#include<stack>
#include<map>
#include<set>
#include<stdlib.h>
#include<time.h>
#include <iomanip>
#define lowbit(x) (x&(-x))
#define inf 0x7fffffff
#define linf 0x7fffffffffffffff
#define mem(x,y) memset(x,y,sizeof(x))
#define fup(i,x,y) for(int i=(x);i<=(y);i++)
#define fdn(i,x,y) for(int i=(x);i>=(y);i--)
#define sp(x) setprecision(x)
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d%d",&n,&m)
#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define sld(n) scanf("%lld",&n)
#define sldd(n,m) scanf("%lld%lld",&n,&m)
#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
#define sf(n) scanf("%lf",&n)
#define sff(n,m) scanf("%lf%lf",&n,&m)
#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
#define sc(n) scanf("%s",n)
#define pf(x) printf("%d\n",x)
#define pfl(x) printf("%lld\n",x)
#define pff(x) printf("%lf\n",x)
#define debug printf("!!\n");
#define N 1000000
#define M 1000000
#define pi acos(-1)
#define eps 1e-2
//cout.setf(ios::fixed);
//freopen("out.txt","w",stdout);// freopen("in.txt","r",stdin);
using namespace std;
typedef long long ll;
typedef double db;
const int mod=1e9+7;
class node
{
public:int fa,son[2],ma,num,data;
bool is_root,Reverse;
void ini()
{
is_root=1;
fa=son[0]=son[1]=Reverse=ma=num=data=0;
}
}t[N+M];
struct edges
{
int x,y,a,b;
void read()
{
sdd(x,y);
sdd(a,b);
}
bool operator<(const edges b) const
{
return a<b.a;
}
}e[N+M];
int n,m;
void pushreverse(int x)
{
if(!x) return ;
swap(t[x].son[0],t[x].son[1]);
t[x].Reverse^=1;
}
void update(int x)
{
t[x].num=x;
t[x].ma=t[x].data;
int l=t[x].son[0],r=t[x].son[1];
if(l&&t[l].ma>t[x].ma) t[x].ma=t[l].ma,t[x].num=t[l].num;
if(r&&t[r].ma>t[x].ma) t[x].ma=t[r].ma,t[x].num=t[r].num;
}
void pushdown(int x)
{
if(t[x].Reverse)
{
pushreverse(t[x].son[0]);
pushreverse(t[x].son[1]);
t[x].Reverse=false;
}
}
int get(int x)
{
return x==t[t[x].fa].son[1];
}
void Rotate(int x)
{
if(t[x].is_root) return;
int k=get(x),fa=t[x].fa,fafa=t[fa].fa;
t[fa].son[k]=t[x].son[k^1];
if(t[x].son[k^1]) t[t[x].son[k^1]].fa=fa;
t[x].son[k^1]=fa;
t[fa].fa=x;
t[x].fa=fafa;
if(!t[fa].is_root) t[fafa].son[fa==t[fafa].son[1]]=x;
else t[x].is_root=true,t[fa].is_root=false;
update(fa),update(x);
}
void push(int x)
{
if(!t[x].is_root) push(t[x].fa);
pushdown(x);
}
void splay(int x)
{
push(x);
for(int fa;!t[x].is_root;Rotate(x))
{
if(!t[fa=t[x].fa].is_root) Rotate(get(x)==get(fa)?fa:x);
}
}
void access(int x)
{
int y=0;
do
{
splay(x);
t[t[x].son[1]].is_root=true;
t[t[x].son[1]=y].is_root=false;
update(x);
x=t[y=x].fa;
}while(x);
}
void mroot(int x)
{
access(x);
splay(x);
pushreverse(x);
}
void link(int u,int v)
{
mroot(u);
t[u].fa=v;
update(u);
}
void cut(int u,int v)
{
mroot(u);
access(v);
splay(v);
t[u].is_root=true;
t[u].fa=t[v].son[0]=0;
}
void cut1(int u,int v)
{
mroot(u);
access(v);
splay(v);
int l=t[v].son[0];
t[l].is_root=true;
t[l].fa=t[v].son[0]=0;
}
int fa[N+M];
int findf(int x)
{
return fa[x]==x? x: fa[x]=findf(fa[x]);
}
int main()
{
sdd(n,m);
fup(i,1,n+m)
t[i].ini();
fup(i,1,m)
e[i].read();
sort(e+1,e+1+m);
fup(i,1,m)
t[i+n].data=t[i+n].ma=e[i].b;
int ans=inf;
fup(i,1,n+m)
fa[i]=i;
fup(i,1,m)
{
if(e[i].x==e[i].y) continue;
int x=findf(e[i].x),y=findf(e[i].y);
if(x!=y)
{
link(e[i].x,i+n);
link(e[i].y,i+n);
fa[x]=fa[y]=findf(i+n);
}
else
{
mroot(e[i].x);
access(e[i].y);
splay(e[i].y);
int xx=t[e[i].y].num;
if(e[i].b<t[xx].data)
{
cut1(e[i].x,xx);
cut1(e[i].y,xx);
link(e[i].x,i+n);
link(e[i].y,i+n);
}
}
if(findf(1)==findf(n))
{
mroot(1);
access(n);
splay(n);
ans=min(ans,t[n].ma+e[i].a);
}
}
pf(ans==inf? -1:ans);
char c[15];
}
bzoj 3669 魔法森林 LCT
猜你喜欢
转载自blog.csdn.net/qq_25973789/article/details/81227115
今日推荐
周排行