將最小生成樹構建出來, 將沒加入最小生成樹的邊稱為 「虛邊」,
假設有一條 「虛邊」 為 u,v
u,v, 則 u,v
u,v 在樹上的路徑上的邊可能被替換, 稱路徑上的邊被覆蓋 .
同上 .
#include
#define reg register
#define pb push_back
intread()
while
(isdigit
(c)) s = s*
10+ c-
'0', c =
getchar()
;return s * flag;
}const
int maxn =
2e6+5;
int n;
int m;
int num0;
int f[maxn]
;int head[maxn]
;struct edge edge[maxn<<1]
;void
add(
int from,
int to,
int w,
int id)
; head[from]
= num0;
}int
find
(int x)
struct edge e[maxn]
;std::multiset <
int> st;
std::multiset <
int>
::iterator it;
std::vector <
int> b[maxn]
;std::vector a;
bool
cmp_1
(edge a, edge b)
void
krus()
}}}int dep[maxn]
;int ans[maxn]
;int fk[
100005][
21];int mk[
100005][
21];int fa_edge[maxn]
;int size[maxn]
;int max_son[maxn]
;int fa[maxn]
;int max_w[maxn]
;void
dfs_1
(int k,
int fa)
}int dfn_tim;
int mp[maxn]
;int dfn[maxn]
;int top[maxn]
;void
dfs_2
(int k,
int fa)
}void
modify_p
(int x,
int y,
int z)
if(dfn[x]
> dfn[y]
) std::
swap
(x, y)
; b[dfn[x]+1
].pb(z)
, b[dfn[y]+1
].pb(
-z);
}void
dfs_0
(int k,
int fa)
}int
mca(
int a,
int b)
s = std::
max(s, mk[a][0
]); s = std::
max(s, mk[b][0
]);return s;
}int
main()
for(reg int i =
1; i <= n; i ++)if
(st.
empty()
) ans[fa_edge[x]]=
1e9+1;
else ans[fa_edge[x]]=
*st.
begin()
;}for(reg int i =
1; i <= m; i ++
)printf
("%d\n"
, ans[i]-1
);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! edge.w plus 1
return0;
}
簡單題 最小生成樹, 樹鏈剖分, 樹上差分
將最小生成樹構建出來,將沒加入最小生成樹的邊稱為 虛邊 假設有一條 虛邊 為 u,v u,vu,v,則 u,v u,vu,v 在樹上的路徑上的邊可能被替換,稱路徑上的邊被覆蓋 同上 include define reg register define pb push back intread whi...
BZOJ2238 mst(最小生成樹 樹鏈剖分)
樹剖好題。首先按題意做出最小生成樹,如果做不出,那麼所有詢問都是 not connected 同樣,如果刪的是非生成樹上的邊,對答案不會造成影響,直接輸出最小生成樹的權值即可。那麼考慮生成樹上的邊被刪的情況 很明顯,對於乙個環上的所有邊,如果刪掉一條,剩下的點仍然會保持聯通。所以這個環上的所有邊都是...
樹上的簡單操作 樹鏈剖分
某神犇 樹鏈剖分什麼垃圾,能做的lct都能做,不能做的lct也能做 線段樹,都會線段樹了應該知道什麼是樹吧 現在考慮一棵樹,每個節點都有乙個點權,要求給x到y路徑上的點都加上k,這個問題可以用樹上差分很簡單地在o m n 的複雜度內解決。再考慮乙個問題,要求查詢樹上x到y這條路徑上的權值和,也可以先...