基環樹的最長鏈

2021-09-28 22:19:24 字數 1362 閱讀 9946

本題給定幾個基環樹的森林,求每棵基環樹的直徑長度之和

思路:先單獨考慮一棵基環樹,先dfs找環(也可tarjan),先把每個環上的點向外擴充套件,找出它們每棵子樹的直徑,用樹型dp處理,接著拆環成鏈,再複製一倍的鏈長,在環上跑,用單調佇列維護即可,但是維護前還需要預處理下直徑字首和,否則會爆時間。

**來自wss巨佬:

#include

#define n 1000005

using

namespace std;

struct nodee[

2000005];

long

long n,ans,tot=

1,head[n]

,z[n]

,zz,js,dfn[n]

,fa[n]

;bool vis[n]

,cir[n]

;//cir是否在環中

void

build

(int a,

int b,

long

long c)

void

dfs1

(int p,

int ei)

//找環

else

if(dfn[v]

>dfn[p])}

}}long

long d[n]

,mx;

voiddp(

int p,

int fa)}}

long

long sm[n*2]

,hc[n*2]

,nn,pos[n*2]

,l,r;

//pos儲存佇列

void

dfs2

(int p,

int i,

int ei)

//預處理直徑字首和 }}

void

work

(int p)

for(

int i=

1;i<=zz;i++

) hc[i]

=hc[i+zz]

=z[i]

; nn=zz+zz;

dfs2

(z[1],

1,0)

; l=

1;r=0;

for(

int i=

1;i<=nn;i++

)//單調佇列

ans+

=mx;

}int

main()

for(

int i=

1;i<=n;i++

)printf

("%lld"

,ans)

;}

初識基環樹 gay環樹?

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

基環樹小結

持續更新ing 圖 的環顯而易見,一般的初始化流程有兩個 1 找環 void get ring ll u,ll fa cf835f 題目大意 刪掉一條邊,在保持聯通性的基礎上求最小直徑 既然要保持連通性,就只能考慮在環上刪邊 先將環中的每個節點子樹最大直徑求出 不跨過環 ll get d ll u,...

基環樹略解

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