欧拉图、哈密顿图、竞赛图

1 欧拉图

OI-Wiki

1.1 欧拉图定义

通过图中所有边恰好一次且行遍所有顶点的 通路 称为欧拉通路。

通过图中所有边恰好一次且行遍所有顶点的 回路 称为欧拉回路。

具有欧拉回路 的无向图或有向图称为 欧拉图

具有欧拉通路但不具有欧拉回路 的无向图或有向图称为 半欧拉图

非形式化地讲,欧拉图就是从 任意一个点 开始都可以一笔画完整个图,半欧拉图必须从 某个点 开始才能一笔画完整个图 。

1.2 求欧拉回路、通路

到一个点之后,将所有经过这个点的环都遍历完成,再将这个点加入序列中。

void find_eulerian_path(int x) // 求经过无向图每条边的欧拉回路
{
    for(int &i=hea[x];i;i=nex[i]) // &i 必须带 &,可以让 hea[x] 在其他的循环中同时也修改掉,否则复杂度是错的
    {
        if(used[num[i]]) continue;
        int tmp=ver[i];
        used[num[i]]=1;
        find_eulerian_path(ver[i]);
        sta[++tp]=tmp;
    }
}

find_eulerian_path(1);
sta[++tp]=1;

2 哈密顿图

OI-Wiki 原文

图中经过每个点有且仅有一次的 路径 叫做哈密顿通路。

图中经过每个点有且仅有一次的 回路 叫做哈密顿回路。

求哈密顿回路?见后文。

3 竞赛图

3.1 竞赛图定义

\(n\) 个点的有向完全图被称为竞赛图,或者说任意两个点之间有且仅有一条有向边。

3.2 竞赛图性质

既然竞赛图这么优美,他一定有一些特殊的性质吧!

  • 竞赛图缩点之后是一条!不过这不是一般的链,它在链上所有在 \(x\) 前面的点都有指向 \(x\) 的边,\(x\) 有指向所有向它之后的点的边。
  • 竞赛图必有哈密顿通路。
  • 强联通竞赛图必有哈密顿回路。

3.3 求竞赛图的哈密顿通路、回路

可见模板题:P3561 [POI2017]Turysta

首先缩点,拓扑序之后只用对每个强联通子竞赛图求哈密顿回路即可构造。

在强联通竞赛图中,以任意顺序加入每个点,一定可以将它插入在某个位置使得仍然构成一条链。

在链上找到两个点 \(p,q\) 其中链上 \(p\)\(q\) 前面,满足 \(t\rightarrow p,q\rightarrow s\),这样就可以构成哈密顿回路了。

代码?咕咕咕,嘴巴跑路

posted @ 2021-08-04 17:33  EricQian06  阅读(410)  评论(0编辑  收藏  举报