欧拉回路判断:
对于无向图:1.两个或没有奇点;2.图连通;
对于有向图:1. 两种 (1)一个点出度大于入度1且另一个点入度大于出度1; (2)入度都等于出度; 2.图连通;
判断图连通1.dfs;2.bfs;3.floodfill; 即从某个点出发能否把所有点都遍历到;
输出欧拉路径: 从上述任一奇点出发(若无奇点则任一点出发就好);
1) 随便找一条未走过的相通的边走,走一条就删去一条边,直到没有一条边能走,就push这个点到堆栈中,返回上一个点,然后重复操作1);
2) 输出堆栈内容即为答案;
这个是因为是随便选一条边走的,所以可能存在未走完所有边就回来的情况,所以对于每个点都要递归返回来看有没有另一条边可走;
代码实现(倒序输出路径的):
无向图:
void euler (int u) { for(int v=0;v<n;v++) if((G[u][v]||G[v][u])&&!vis[u][v]) { vis[u][v]=vis[v][u]=1; euler(v); printf("%c %c\n",u,v); } }有向图:
void euler (int u) { for(int v=0;v<n;v++) if(G[u][v]&&!vis[u][v]) { vis[u][v]=1; euler(v); printf("%c %c\n",u+'A',v+'A'); } }