图G的一个回路,若它通过G的每一条边一次,则称该回路为欧拉回路。具有欧拉回路的图称为欧拉图。
欧拉图就是从一个顶点出发,经过所有的边必须且只能一次,最终回到起点的路径。
要想一个图是欧拉图,必须要满足两个条件:第一,图是连通的,不能有孤立的点存在;第二,对于无向图来说,度数为奇数的点的个数必须为零;对于有向图来说,每个顶点的如度要等于出度。
求解欧拉回路的方法:使用深度优先搜索,如果每条边被搜索到,则标记这条边为已选择,并且即使回溯也不能将当前边的状态改为未选择。每次回溯的时候,记录回溯的路径。深度优先搜索后记录的回溯路径就是欧拉回路。
具体实现使用链式前向星和深度优先搜索实现的欧拉算法程序如下,注意用链式前向星存储无向边时,每条边被存储了两遍。
/*int ip,head[10005]; struct note { int to; int next; bool vis; }; note edge[100004];*/ int ans[maxm],ansi=0; /*void add(int u,int v) { if(u==1) t=ip; edge[ip].to=v;edge[ip].next=head[u];head[u]=ip++; }*/ void dfs(int x) { for(int k=head[x];k!=-1;k=edge[k].next) { if(!edge[k].vis) { edge[k].vis=true;//标记当前边 edge[k^1].vis=true;//标记反向的另一条边 printf("(%d,%d)\n",edge[k].to,xx++); dfs(edge[k].to); ans[ansi++]=k;//回溯过程中记录边 } } }