dfs序 欧拉序
dfs 序
就是按照 dfs 的顺序遍历整棵树的时候再加一个数组记录经过的编号就行了。
#include <bits/stdc++.h>
#define V e[i].v
using namespace std;int rd(){
int w=0,v=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')v=-1;c=getchar();}
while(c>='0'&&c<='9'){w=(w<<1)+(w<<3)+(c&15);c=getchar();}return w*v;
}void wr(int x){
char c[20];int l=0;if(x<0){putchar((1<<5)+(1<<3)+(1<<2)+1);x=~x+1;}
do{c[l++]=x%10+(1<<4)+(1<<5);x/=10;}while(x>0);for(int i=l-1;i>=0;i--)putchar(c[i]);putchar('\n');
}const int N=2e6;int n,m,fir[N],c,cnt;struct E{int v,nt;}e[N<<1];
void I(int u,int v){e[++c].v=v;e[c].nt=fir[u];fir[u]=c;}
int d_[N],tot;//dfs 序
void dfs(int u,int f){d_[u]=++tot;for(int i=fir[u];i;i=e[i].nt)if(V!=f)dfs(V,u);}
int main(){n=rd();for(int i=1,u,v;i<n;i++)u=rd(),v=rd(),I(u,v),I(v,u);dfs(1,0);return 0;}
欧拉序
就是按照 dfs 的顺序遍历整棵树的时候绕回原点时所有点的顺序。
写法就是在 dfs 遍历到某个点时加进欧拉序中,遍历完当前的子树之后再次加进欧拉序中。
#include <bits/stdc++.h>
#define V e[i].v
using namespace std;int rd(){
int w=0,v=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')v=-1;c=getchar();}
while(c>='0'&&c<='9'){w=(w<<1)+(w<<3)+(c&15);c=getchar();}return w*v;
}void wr(int x){
char c[20];int l=0;if(x<0){putchar((1<<5)+(1<<3)+(1<<2)+1);x=~x+1;}
do{c[l++]=x%10+(1<<4)+(1<<5);x/=10;}while(x>0);for(int i=l-1;i>=0;i--)putchar(c[i]);putchar('\n');
}const int N=2e6;int n,m,fir[N],c,cnt;struct E{int v,nt;}e[N<<1];
void I(int u,int v){e[++c].v=v;e[c].nt=fir[u];fir[u]=c;}
int dfn[N];//欧拉序
void dfs(int u,int f){dfn[++cnt]=u;for(int i=fir[u];i;i=e[i].nt)if(V!=fa)dfs(V,u),dfn[++cnt]=u;}
int main(){n=rd();for(int i=1,u,v;i<n;i++)u=rd(),v=rd(),I(u,v),I(v,u);dfs(1,0);return 0;}