約會 Rendezvous 基環樹

2022-03-26 22:52:07 字數 1470 閱讀 2647

提煉:tarjan判環,dfs建樹,倍增lca,預處理環兩點間距離

我犯的錯誤:

1.基環樹不只有一棵,可以有很多

2.自環不能將其忽略,(對於我的演算法)應該將其特殊考慮在演算法內

3.**一定要簡潔有力,不能讓自己調都噁心

code

陣列含義:

que[n]佇列,in_que[n]tarjan判是否入隊,dfn[n],low[n],bel[n]點屬於的集合

ver[n]根節點的集合編號,to[n],nxt[n],head[n],f[n][20]倍增lca,d[n]深度,bel_rt[n]點屬於的樹的根

extra[n],ex[n]特判自環專用,

vectorvec[n]tarjan點集合

#include#include

const

int l=1

<<20|1

;char buffer[l],*s,*t;

#define getchar() ((s==t&&(t=(s=buffer)+fread(buffer,1,l,stdin),s==t))?eof:*s++)

using

namespace

std;

const

int n=5e5+5

;int

n,k,num_tarjan,num_bian,num_huan,top,

que[n],in_que[n],dfn[n],low[n],bel[n],ver[n],to[n],nxt[n],head[n],f[n][

20],d[n],bel_rt[n],extra[n],ex[n];

vector

vec[n];

intread()

void add(int x,int y)

inline

int max(int a,int b)

inline

int min(int a,int b)

void tarjan(int

x)while(y!=x);

if((int)vec[num_huan].size()>1)ex[++ex[0]]=num_huan;

}}void dfs(int x,int depth,int

root)

}}int

get(int x,int

y)int

main()

}for(int i=1;i<=extra[0];++i)

if(!d[extra[i]])

for(int i=1,x,y;i<=k;++i)

else}}

}return0;

}

初識基環樹 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 則我們稱它是基環樹。顧名思義,基環樹就好似是在一棵樹上加一條邊得到的圖。基環樹有且僅有乙個環,所以也被成為環套樹。如上圖所示的圖就是一棵基環樹。基環樹沒什麼用。它只能解決部分特殊問題,而這類問題通常會註明 邊數 ...