欧拉回路(一笔画)

来源:互联网 发布:网络存储服务器作用 编辑:程序博客网 时间:2024/04/29 03:25

欧拉回路判断:

对于无向图: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');}}

对于一些无法走完边的回路,如七桥问题,上述代码也能输出连通所有点但未走完所有边的欧拉回路;





0 0
原创粉丝点击