• 欧拉路&&欧拉回路


      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 ;
    }
  • 相关阅读:
    C#异常小知识
    Cisco路由器配置学习-ip accounting
    Sublime Text 3预览Markdown
    什么是permit-inside功能
    锐捷双出口
    思科双出口+策略路由+NAT
    github常见操作和常见错误
    网易注册页面知识点
    java,xml等注释删除,正则表达式使用123
    简单多线程是否安全判断
  • 原文地址:https://www.cnblogs.com/hzoi-kx/p/11795099.html
Copyright © 2020-2023  润新知