基環樹,也叫環套樹,是一種圖的型別。如果連通圖 g
=g=\
g=有 ∣v∣
=∣e∣
|v|=|e|
∣v∣=∣e
∣,則我們稱它是基環樹。
顧名思義,基環樹就好似是在一棵樹上加一條邊得到的圖。基環樹有且僅有乙個環,所以也被成為環套樹。
如上圖所示的圖就是一棵基環樹。
基環樹沒什麼用。
它只能解決部分特殊問題,而這類問題通常會註明「邊數=點數」,解法也比較單一,常被與其他演算法一同考察。
我們來看幾道例題。
例(luogu p1453 城市環路)今有基環樹 g
=g=\
g=,定義ans
=∑i=
1nai
⋅bians=\sum_^
ans=i=
1∑n
ai⋅
bi∀i∈
[1,n
]∩n∗
\forall i\in[1,n]∩\n^*
∀i∈[1,
n]∩n
∗ 有 bi∈
b_i\in\
bi∈
,且 ∀e=
(u,v
)∈e\forall e=(u,v)\in e
∀e=(u,
v)∈e
有 bu
and bv
=0b_u\textb_v=0
buand bv
=0(and
\text
and 表示按位與運算)。求 ans
max
ans_
ansmax。
solution本題中如果 n=m
+1n=m+1
n=m+
1,這顯然就是「沒有上司的舞會」了。
考慮將新問題轉化成已解決的問題。我們發現,環上有且僅有一條邊對計算不產生影響,刪除它即可。由一條邊上的兩個點不能被同時選中,不難想到給每個點設定兩個狀態:選中(1)與不選中(0);並查集找環,刪除一條邊後做樹形動態規劃即可解決此題。時間複雜度 o(n
α(n)
)o(n\alpha(n))
o(nα(n
))。參考**
#include
#include
#include
const
int maxn=
100010
;int fa[maxn]
;int a[maxn]
;int sx,sy,fx,fy;
int st,ed;
int n;
struct nodee[maxn+maxn]
;int len=0;
int first[maxn]
;int ans;
int f[maxn][3
];intfindfa
(int x)
void
ins(
int x,
int y)
intmax
(int x,
int y)
void
dfs(
int x,
int last)
}inline
intread()
intmain()
memset
(first,0,
sizeof
(first));
for(
int i=
1;i<=n;
++i)
ins(sx,sy)
;ins
(sy,sx)
; fa[fx]
=fy;
}memset
(f,0
,sizeof
(f))
;dfs
(st,0)
;ans=f[st][0
];dfs(ed,0)
;ans=
max(ans,f[ed][0
]);double k;
scanf
("%lf"
,&k)
;printf
("%.1lf"
,ans*k)
;}
接下來的這道習題與例題的思路不太一樣。
練習 1([noip2018] luogu p5022 旅行)有一棵基環樹 t
tt,你初始在乙個點上。每次可以從下列選項中選擇一項執行:
沿著一條邊走到乙個沒有訪問過的點;
沿著一條邊返回乙個訪問過的點。
你需要依此法訪問所有的 n
nn 個點。每個點被首次訪問的順序形成了乙個序列,求這個序列字典序最小的那個。
基環樹的建圖同樣重要。
練習 2(luogu p2607 [zjoi2008]騎士)有 n
nn 個人,每個人有兩個值:d
id_i
di 戰鬥力,t
it_i
ti 討厭的人的編號(ti≠
it_i\neq i
ti=
i)。從這 n
nn 個人中選出若干個人,使他們討厭的人沒被選中,且他們的戰鬥力之和最大。
基環樹的初步內容較少,解法單一,經常與其他演算法一同出現。
解決基環樹上問題的關鍵點就是:處理額外邊,將原問題轉化成樹上問題。
kruscal重構樹略解
這道題珂以用啟發式合併 主席樹來做 離線做法就不行了 我們就要用乙個叫做kruscal重構樹的東西來解決這個問題 克魯斯卡爾重構樹可以用來解決一類諸如 查詢從某個點出發經過邊權不超過val的邊所能到達的節點 的問題 首先不難發現,上面這個問題肯定是在最小生成樹上走最優,其他邊都可以不用去管 krus...
初識基環樹 gay環樹?
衢州飯店出鍋了?以為自己幸運,哪知無法逃過一劫。學個oi,菊花不保啊 霧。最近考了好多道關於基環樹 包括基環內向樹基環 外向樹 的題,趁機學一波 首先明確,基環樹不是樹。其是一顆樹 一條額外的邊,即一顆樹 乙個環。大致簡述一下這種特殊結構出現的主要原因就是n個點連出去n條邊,而樹是n點n 1條邊,這...
基環樹小結
持續更新ing 圖 的環顯而易見,一般的初始化流程有兩個 1 找環 void get ring ll u,ll fa cf835f 題目大意 刪掉一條邊,在保持聯通性的基礎上求最小直徑 既然要保持連通性,就只能考慮在環上刪邊 先將環中的每個節點子樹最大直徑求出 不跨過環 ll get d ll u,...