欧拉回路的解法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧拉回路的解法相关的知识,希望对你有一定的参考价值。

参考技术A

无向图欧拉回路解法
求欧拉回路的一种解法
下面是无向图的欧拉回路输出代码:注意输出的前提是已经判断图确实是欧拉回路。
C语言代码,不全,请不要直接粘贴。 intnum=0;//标记输出队列intmatch[MAX];//标志节点的度,无向图,不区分入度和出度voidsolve(intx)if(match[x]==0)Record[num++]=x;elsefor(intk=0;k<=500;k++)if(Array[x][k]!=0)Array[x][k]--;Array[k][x]--;match[x]--;match[k]--;solve(k);Record[num++]=x;pascal代码:
求无向图的欧拉回路(递归实现) programeuler;constmaxn=10000;顶点数上限maxm=100000;边数上限typetnode=^tr;tr=recordf,t:longint;边的起始点和终止点al:boolean;访问标记rev,next:tnode;反向边和邻接表中的下一条边end;varn,m,bl:longint;顶点数,边数,基图的极大连通子图个数tot:longint;g:array[1..maxn]oftnode;d:array[1..maxn]oflongint;顶点的度fa,rank:array[1..maxn]oflongint;并查集中元素父结点和启发函数值list:array[1..maxm]oftnode;最终找到的欧拉回路o:boolean;原图中是否存在欧拉回路procedurebuild(ta,tb:longint);在邻接表中建立边(ta,tb)vart1,t2:tnode;begint1:=new(tnode);t2:=new(tnode);t1^.f:=ta;t1^.t:=tb;t1^.al:=false;t1^.rev:=t2;t1^.next:=g[ta];g[ta]:=t1;t2^.f:=tb;t2^.t:=ta;t2^.al:=false;t2^.rev:=t1;t2^.next:=g[tb];g[tb]:=t2;end;proceduremerge(a,b:longint);在并查集中将a,b两元素合并varoa,ob:longint;beginoa:=a;whilefa[a]<>adoa:=fa[a];fa[oa]:=a;ob:=b;whilefa[b]<>bdob:=fa[b];fa[ob]:=b;ifa<>bthenbegindec(bl);合并后,基图的极大连通子图个数减少1ifrank[a]=rank[b]theninc(rank[a]);ifrank[a]>rank[b]thenfa[b]:=aelsefa[a]:=b;end;end;procedureinit;初始化vari,ta,tb:longint;beginfillchar(fa,sizeof(fa),0);fillchar(rank,sizeof(rank),0);fillchar(d,sizeof(d),0);readln(n,m);fori:=1tondofa[i]:=i;bl:=n;fori:=1tomdobeginreadln(ta,tb);build(ta,tb);inc(d[tb]);inc(d[ta]);merge(ta,tb);end;end;proceduresearch(i:longint);以i为出发点寻找欧拉回路varte:tnode;beginte:=g[i];whilete<>nildobeginifnotte^.althenbeginte^.al:=true;te^.rev^.al:=true;search(te^.t);list[tot]:=te;dec(tot);end;te:=te^.next;end;end;proceduremain;主过程vari:longint;begino:=false;fori:=1tondoifd[i]=0thendec(bl);排除孤立点的影响ifbl<>1thenexit;原图不连通,无解fori:=1tondoifodd(d[i])thenexit;存在奇点,无解o:=true;fori:=1tondoifd[i]<>0thenbreak;tot:=m;search(i);从一个非孤立点开始寻找欧拉回路end;procedureprint;输出结果vari:longint;beginifnotothenwriteln('Nosolution.')elsebeginwriteln(list[1]^.f);fori:=1tomdowriteln(list[i]^.t);end;end;begininit;main;print;end.注意record中的点的排列是输出的倒序,因此,如果要输出欧拉路径,需要将record倒过来输出。
求欧拉回路的思路:
循环的找到出发点。从某个节点开始,然后查出一个从这个出发回到这个点的环路径。这种方法不保证每个边都被遍历。如果有某个点的边没有被遍历就让这个点为起点,这条边为起始边,把它和当前的环衔接上。这样直至所有的边都被遍历。这样,整个图就被连接到一起了。
具体步骤:
1。如果此时与该点无相连的点,那么就加入路径中
2。如果该点有相连的点,那么就加入队列之中,遍历这些点,直到没有相连的点。
3。处理当前的点,删除走过的这条边,并在其相邻的点上进行同样的操作,并把删除的点加入到路径中去。
4。这个其实是个递归过程。

以上是关于欧拉回路的解法的主要内容,如果未能解决你的问题,请参考以下文章

欧拉回路混合图的欧拉回路

欧拉除了函数,还有个回路----图论之路之欧拉路径欧拉回路

欧拉道路与欧拉回路

欧拉回路——欧拉路与欧拉回路

欧拉回路

欧拉回路与欧拉路径