void dfs(intu)
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 usingnamespace
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...