请检查你的欧拉序列是否加了当前弧优化。即每次到一个点的时候,不直接从这一个点连的第一条边开始,而是从上一次到这个点使用的边的后继开始。
AC 代码:
void dfs(int p)
{
for(int i=hd[p];i;i=hd[p])
{
int v=e[i].right;
hd[p]=e[i].up;
if(vis[i]||vis[i^1]) continue;
vis[i]=vis[i^1]=1;
dfs(v);
AT[++cnt]=e[i].rv;AT[++cnt]=e[i].ru;
}
return ;
}
TLE 代码:
void dfs(int p)
{
for(int i=g[p];i;i=e[i].up)
{
int v=e[i].right;
if(vis[i]||vis[i^1]) continue;
vis[i]=vis[i^1]=1;
dfs(v);
AT[++cnt]=e[i].rv;AT[++cnt]=e[i].ru;
}
return ;
}
下面一种写法可以被极限数据卡到 O(n2) 的复杂度。