欧拉路&&欧拉回路

  T1是欧拉路板子,但我不会,直接爆炸。。

这玩意就是个dfs,但我以前一直以为欧拉路只能$O(nm)$求

今天才知道可以$O(n+m)$

欧拉路判定:

无向:起点终点为奇度点,其余偶度

有向:起点终点出度入度分别差一,其余相等。

欧拉回路类似。

怎么求??

我们可以很容易找到起点。然后由于其他点的度数为偶数,就可以保证进去就一定可以出来。

所以瞎搜就完事,注意到有环套环的情况,我们先把这个点扩展完再把该点入栈。

代码实现很简单:

 

void dfs(int x)
{
  for(int i=head[x];i;i=nxt[i])
    
if(!v[id[i]])
    {       v[id[i]]=1;
      dfs(to[i]);
      s[++top]=id[i];     }  return ; }

 

一点优化:

当前弧优化,注意到有些毒瘤出题人卡这种做法。

因为一个点不止拓展一次,那么复杂度就没有保证了,最简单的数据就是两个点直接连着m条边。

所以有大佬发明了这样一个优化:

一条边被访问过就没用了,所以我们可以直接把表头设为第一个合法的,也就是去除无用状态。

代码:

void dfs(int x)
{
    int i=head[x];
    while(i)
    {
        while(i&&v[id[i]]!=0) i=nxt[i];
        head[x]=i;
        if(i)
        {
            v[id[i]]=1;
            dfs(to[i]);
            s[++top]=id[i];
            i=head[x];
        }
    }
    return ;
}
posted on 2019-11-04 21:44  _kx  阅读(237)  评论(0)    收藏  举报