图论杂项
rt,一些琐碎的知识点,可能会补充例题。
欧拉路径
定义
-
欧拉路径:每条边都通过一次的路径。
-
欧拉回路:起点和终点都相同的路径。
-
有向图弱联通:将有向边当成无向边后原图联通
分析
对于欧拉路径的判定,通常从点的出度和入度下手分析。下面以无向图为例分析。
如果一个点是起点。从这个点出发以后,每经过一次这个点,都要从一条入边进,一条出边出。
可以推断出这个点的度数一定是奇数,同理可以得到终点的度数为奇数。
特殊的,如果最后从一条入边回到起点,则可以找到一条欧拉回路。
判断结论:
-
无向图存在欧拉路径:无向图联通,且仅两个点度数为奇数。
-
无向图存在欧拉回路:无向图联通,所有点度数均为偶数。
-
有向图存在欧拉路径:有向图弱联通,且一个点入度比出度少一,一个点出度比入度少一,其余点入度等于出度。
-
无向图存在欧拉回路:有向图弱联通,所有点入度均等于出度。
实现
欧拉路径的查找通常使用 \(\text{DFS}\)。
//有向图DFS:
//cout<<x<<" "; 错误写法
for(int i=last[x];i<g[x].size();i=last[x]){
last[x]=i+1;
dfs(g[x][i]);
}
stk[++top]=x;
output:
dfs(s);
while(top)printf("%d ",stk[top--]);
第一种写法的错误之处在于没有将欧拉路径嵌套在一起,导致欧拉路径分成了多个不连续的段落。
往往一张图的欧拉路径有许多,题目会要"输出字典序最小的方案"。常见的处理方法是贪心:用 vector 存图,将每一个图所联通的点按大小排序。
例题
P7771 【模板】欧拉路径
模板题,写了就行