欧拉路&&欧拉回路

只谈情不闲聊 提交于 2019-12-03 11:56:11

  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;      dfs1(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 ;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!