題解:
lct維護生成樹
首先先把a按照權值從小到大排序
然後維護路徑間b的最小值(其實就是滿足樹的性質)
如果這兩點之間連邊了,我們就找到其中的最大邊,判斷一下他和當前點的大小關係
邊權變成點權處理就可以了
**:
#include usingnamespace
std;
#define n 200000
struct
rea[n*2
];int
v[n],data[n],data2[n],n,m;
intleftson[n],rightson[n],fa[n];
bool
rev[n];
bool
cmp(re x,re y)
void updata(int
x)void down(int
x)bool pd(int
x)void rotate(int x,inty)
else
fa[x]=fa[father];
if(pd(father))
if (y==1) leftson[x]=father;
else rightson[x]=father;
fa[father]=x;
updata(father); updata(x);
}void dfs(int
x)void splay(intx)
else
father=fa[x];
}}void access(int
x)void makeroot(int
x)int findroot(int
x)void split(int x,int
y)bool find(int x,int
y)void link(int x,int
y)void cut(int x,inty)}
intmain()
} else
if (find(1
,n))
}if (ans==1e9) cout<<-1
;
else cout
}
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 魔法森林
noi2014 魔法森林 要求a 與 b 的總和最小 可以按a排序 再以b為權值維護一顆樹 lct維護最小生成樹 要解決的問題 將每一條邊變為乙個點 邊權變為點權 舉個栗子 u v有一條邊權為w的邊 怎lct連邊方式為 u new v new的點權為w 不斷維護最小生成樹 如果新加入的邊的 u與v不...