基環樹小結

2022-05-20 20:46:04 字數 1666 閱讀 2183

持續更新ing

圖**的環顯而易見,一般的初始化流程有兩個

(1)找環

void get_ring(ll u,ll fa)

}

cf835f

題目大意:刪掉一條邊,在保持聯通性的基礎上求最小直徑

既然要保持連通性,就只能考慮在環上刪邊

先將環中的每個節點子樹最大直徑求出(不跨過環)

ll get_d(ll u,ll fa)else if(now>second[u])

second[u]=now;

}stmp=max(stmp,first[u]+second[u]);

return stmp;

}for(ll i=1;i<=num;++i)

mx[i]=get_d(a[i],0);

以上均為初始化,下面才是難點

易證基環樹的直徑為 max

利用環的性質又可分為越過1-n與不越過1-n分別計算

ll stmp=0;

for(ll i=1;i1;--i)

stmp=0;

for(ll i=1;i<=num;++i)

stmp=0;

for(ll i=num;i>=1;--i)

my complete code:

#includeusing namespace std;

typedef long long ll;

const ll maxn=400000;

struct nodedis[maxn*2];

ll n,num,cnt,ans;

ll head[maxn],a[maxn],eval[maxn],visit[maxn],pre[maxn],s0[maxn],s1[maxn],t0[maxn],t1[maxn],mx[maxn],first[maxn],second[maxn];

bool f[maxn];

inline void add(ll u,ll v,ll d); head[u]=num;

}inline ll max(ll g1,ll g2)

inline ll min(ll g1,ll g2)

void get_ring(ll u,ll fa)else if(now>second[u])

second[u]=now;

}stmp=max(stmp,first[u]+second[u]);

return stmp;

}inline void init()

}inline void solve()

stmp=0;

for(ll i=1;i<=num;++i)

stmp=0;

for(ll i=num;i>=1;--i)

ans=t0[num];

for(ll i=1;i

ans=min(ans,max(max(t0[i],t1[i+1]),s0[i]+s1[i+1]+eval[num]));

}int main()

初識基環樹 gay環樹?

衢州飯店出鍋了?以為自己幸運,哪知無法逃過一劫。學個oi,菊花不保啊 霧。最近考了好多道關於基環樹 包括基環內向樹基環 外向樹 的題,趁機學一波 首先明確,基環樹不是樹。其是一顆樹 一條額外的邊,即一顆樹 乙個環。大致簡述一下這種特殊結構出現的主要原因就是n個點連出去n條邊,而樹是n點n 1條邊,這...

基環樹略解

基環樹,也叫環套樹,是一種圖的型別。如果連通圖 g g g 有 v e v e v e 則我們稱它是基環樹。顧名思義,基環樹就好似是在一棵樹上加一條邊得到的圖。基環樹有且僅有乙個環,所以也被成為環套樹。如上圖所示的圖就是一棵基環樹。基環樹沒什麼用。它只能解決部分特殊問題,而這類問題通常會註明 邊數 ...

約會 Rendezvous 基環樹

提煉 tarjan判環,dfs建樹,倍增lca,預處理環兩點間距離 我犯的錯誤 1.基環樹不只有一棵,可以有很多 2.自環不能將其忽略,對於我的演算法 應該將其特殊考慮在演算法內 3.一定要簡潔有力,不能讓自己調都噁心 code 陣列含義 que n 佇列,in que n tarjan判是否入隊,...