摘要:同样利用深度优先搜索的办法.与欧拉回路求解的思路相似.
基本思路:
【1】首先从图中找到一条从奇数度数节点1到达奇数度数节点2的通路.方法,利用深度优先搜索直到找到另外一个奇数节点.
[2]很显然,删除所有遍历过的边,剩下的图就是一个欧拉回路的图.
[3]利用寻找欧拉回路的基本框架继续寻找.
【4】利用链表Newvertex记录路径和拼接.
【5】关于链表的数据结构和相关函数省略
void Depthfirstsearch2(Graph G,List Newvertex,int start,int & NumEdgevisited,int End)
{
int v = start,w;
Isvisited[v] = true;
List L = G[start]->Next;
while(L!=NULL&&Isvisited[End]==false)
{
w = L->Element;
DeleteList(G[v],w);
DeleteList(G[w],v);
Indegree[v]--;
Indegree[w]--;
NumEdgevisited++;
Depthfirstsearch2(G,Newvertex,w,NumEdgevisited,End);
printf("%d ",w);
Insert_Behind(Newvertex,w);
L = L->Next;
}
}
List FindEulerRoute(Graph G)
{
int start,End;
int NumEdges = ReadGraphIndegree(G);
Getstartend(start,End);
int NumEdgevisited = 0;
List head = (List)malloc(sizeof(Listrecord));
List Newvertex = head;
Newvertex->Element = start;
Depthfirstsearch2(G,Newvertex,start,NumEdgevisited,End);
while(NumEdgevisited < NumEdges)
{
Newvertex = FindNewvertex(Newvertex);
InitialNode = Newvertex->Element;
Depthfirstsearch(G,Newvertex,NumEdgevisited);
printf("%d ",InitialNode);
}
return head;
}