dfs序 tree数组为线段树,len为线段树长度,lazy为懒惰数组
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e4+7;
int n,m;
vector<int> adj[maxn];
int len[maxn],tree[maxn],lazy[maxn<<2],a[maxn];
bool vis[maxn];
int dfs(int u)
{
tree[u]=++m;
int res=1;
for(int i=0;i<adj[u].size();i++)
{
int v = adj[u][i];
if(vis[v]) continue;
vis[v] = true;
res += dfs(v);
}
return len[u] = res;
}
int main()
{
int t,i,j;
scanf("%d",&t);
int ca=1;
while(t--)
{
scanf("%d",&n);
int u,v;
for(i=1;i<=n;i++) adj[i].clear();
memset(a,0,sizeof(a));
memset(len,0,sizeof(len));
for(i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
adj[v].push_back(u);
a[u]++;
}
for(i=1;i<=n;i++)
{
if(!a[i])
{
m = 0;
memset(vis,false,sizeof(vis));
dfs(i);
break;
}
}
}
return 0;
}
本文深入探讨了DFS序和线段树在图论和数据结构中的应用,通过具体的代码实现展示了如何利用DFS序进行节点遍历,并构建线段树以高效处理区间查询和更新操作。特别关注了懒惰数组的使用,以优化大规模数据集上的操作。

被折叠的 条评论
为什么被折叠?



