欧拉图、哈密顿图、竞赛图
1 欧拉图
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 哈密顿图
图中经过每个点有且仅有一次的 路径 叫做哈密顿通路。
图中经过每个点有且仅有一次的 回路 叫做哈密顿回路。
求哈密顿回路?见后文。
3 竞赛图
3.1 竞赛图定义
\(n\) 个点的有向完全图被称为竞赛图,或者说任意两个点之间有且仅有一条有向边。
3.2 竞赛图性质
既然竞赛图这么优美,他一定有一些特殊的性质吧!
- 竞赛图缩点之后是一条链!不过这不是一般的链,它在链上所有在 \(x\) 前面的点都有指向 \(x\) 的边,\(x\) 有指向所有向它之后的点的边。
- 竞赛图必有哈密顿通路。
- 强联通竞赛图必有哈密顿回路。
3.3 求竞赛图的哈密顿通路、回路
可见模板题:P3561 [POI2017]Turysta
首先缩点,拓扑序之后只用对每个强联通子竞赛图求哈密顿回路即可构造。
在强联通竞赛图中,以任意顺序加入每个点,一定可以将它插入在某个位置使得仍然构成一条链。
在链上找到两个点 \(p,q\) 其中链上 \(p\) 在 \(q\) 前面,满足 \(t\rightarrow p,q\rightarrow s\),这样就可以构成哈密顿回路了。
代码?咕咕咕,嘴巴跑路