什么是欧拉路径?在图上用一种走法经过所有的边一次且只有一次的路径叫做欧拉路径。即一笔画。
如果这条路径的起点和终点重合,那么就是欧拉回路。
如何判断图是否有欧拉回路或者欧拉路径?
无向图:因为欧拉路径中,除了起点与终点以外,任意点的“进”“出”次数相等,所以除了两个点为奇点(度数为奇数的点)(终点和起点)以外,其它点的度数均为偶数。
如果是欧拉回路,奇点的个数应该为0。
有向图:欧拉路径中,最多只有两个点的入度不等于出度。起点出度比入度大1,终点入度比出度大1。
如果是欧拉回路,所有点的 入度=出度 。
/*==================================================*\
| EulerPath -- 欧拉回路
| 连通图 -- 可用dfs判断
| 无向图: 不存在奇点
| 有向图: 入度=出度
\*==================================================*/
int n, m, G[maxn][maxn];
int a, b, in[maxn];
bool vis[maxn];
void dfs(int x) {
for(int i = 1; i <= n; ++i) {
if(G[x][i] && !vis[i]) vis[i] = 1, dfs(i);
}
}
bool judge() {
for(int i = 1; i <= n; ++i) if(in[i] % 2) return 0;
int cnt = 0;
for(int i = 1; i <= n; ++i) {
if(!vis[i]) ++cnt, vis[i] = 1, dfs(i);
}
if(cnt > 1) return 0;
return 1;
}
/*==================================================*\
| EulerPath -- 欧拉道路
| 无向图: 最多只有两个奇点
| 有向图: 有一个点的出度比入度大1,另一个点的入度比出度大一,其余相等
\*==================================================*/