dfs序與求子樹子節點(染了色)的個數

2022-05-23 22:30:13 字數 2263 閱讀 3696

void dfs(int

u)

out[u] =ans;

}

該題給出前n個節點有多少個子節點,然後要很多次查詢,看是否為父子關係。

用dfs序做,如果in[x] < in[y] && out[x] > out[y] 則x是y的父節點。用棧模擬來標記每個節點的in於out值。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;typedef pair

pll;

const

int inf = 0x3f3f3f3f

;const

int maxn=20000000+5

;int

n, m;

intstart[maxn];

intc[maxn];

intin

[maxn];

intout

[maxn];

void dfs(int

u)

in[x]=++dfs_clock;

for(int i=start[x];i)

else

//如果小於n則把該點push進去,相當於bfs,然後標記in值,如果大於n則進去就出來所以可以直接標號}}

}int

main()

dfs(0);

printf(

"case %d:\n

",++kase);

intq;

scanf("%d

",&q);

while(q--)

if(t) puts(""

); }

return0;

}

/*

by lstg

*//*

2018-03-05 21:02:03

*/#include

#include

#include

#define maxn 20000005

using

namespace

std;

intdfn[maxn],dfm[maxn],stk[maxn],n;

queue

g[300005];//

這裡太大就會re

void _mydfs(int

x)

else

}}int

main()

_mydfs(0);

printf(

"case %d:\n

",cc);

scanf("%d

",&n);

for(i=1;i<=n;i++)

if(cc!=t)putchar(10

); }

return0;

}

求子樹大小(染色的)

#include using

namespace

std;

const

int maxm = 2e5 + 10

;const

int maxn = 2e5 + 10

;typedef

long

long

ll;struct

edgesedge[maxm];

vector

g[maxn];

intcnt[maxn];

int dfs(int cur,int

from

)

return

cnt[cur];

}int

main ()

int cn = 0

;

for(int i = 0 ; i < n-1 ; i ++)

dfs(

1,-1

); ll exp = 0

;

for(int i = 0 ; i < n-1 ; i ++)

printf(

"%lld\n

",exp);

}

POJ 3321 DFS序 樹狀陣列 查詢子樹

給乙個樹,查詢結點下的子樹的蘋果總數,並且要求支援增減蘋果 查詢子樹,我們首先想到的是dfs序,還要支援修改操作,我們可以用樹狀陣列維護這個dfs序,因為還要查詢,所以我在實際程式中使用了尤拉序。include include include define debug x cout x define...

hiho1576 子樹中的最小權值 dfs序

題意 求以x為根的子樹中的最小權值 思路 dfs序,把樹轉化成乙個序列,類似lca中的轉化,記錄1棵子樹進去的時間戳和出去的時間戳。線段樹求區間最小值 include include include include include include include include include in...

DFS序與尤拉序的區別

dfs序 是指將一棵樹被dfs時所經過的節點順序 不繞回原點 尤拉序 就是從根結點出發,按dfs的順序在繞回原點所經過所有點的順序。通過dfs序判斷v節點的時間區間是否在u節點的時間區間內。通過尤拉序求u和v的最近公共祖先。dfs序 a b d e g c f h 尤拉序 a b d d e g g...