基環樹略解

2021-09-28 21:53:59 字數 2862 閱讀 1199

基環樹,也叫環套樹,是一種圖的型別。如果連通圖 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

bu​and 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,...