欧拉图算法

本文深入探讨了Euler回路及其在半欧拉图中的应用,通过DFS算法实现Euler回路的查找。详细介绍了算法流程与实现细节,包括如何确定起始顶点、如何利用栈保存访问路径、以及如何处理回路。同时,针对不同的图类型(欧拉图、半欧拉图)提供了相应的解决方案。
摘要由CSDN通过智能技术生成
首先考虑是欧拉图。若从一个顶点出发,利用DFS,将新搜索到的顶点保存到栈顶,并且将走过的边给删除,那么一定能访问到这个初始顶点。因为除起始顶点外其他的顶点若被访问到那么一定能去访问别的顶点。但是起始顶点不同,它是被直接访问的,即没有通过别的顶点去访问它,因此我们一定能找到这样的回路,使得起始顶点和终点是同一顶点,设为v,并且v的所有边都在这条回路上。我们用栈来保存这些顶点(按访问的顺序),如果此时栈顶的元素的所有边都被访问过,我们就输出这个顶点并从栈顶释放出这个顶点,紧接着我们对现在栈顶上的元素进行重复操不断的进行DFS,并且也一定能找到上文提到的WT回路。现在不难看出Euler回路实际上是有多个回路所构成的,并且这些回路都是独立的,即没有边的交集,所以基于上述事实,我给出了一个新算法。
Note:copyright from Avenger


#include<iostream>
using namespace std;


int A[100][100],n;
struct node
{
int top;
int nodes[100];
}f;


void DFS(int x)
{
int i;
f.top++;
f.nodes[f.top]=x;
for(i=1;i<=n;i++)
{
if(A[x][i])
{
A[x][i]--;
A[i][x]--;
DFS(i);
break;
}


}
}


void Euler(int x)
{

f.top=1;
f.nodes[f.top]=x;
while(f.top)
{
int b=0;
for(int i=1;i<=n;i++)
{
if(A[f.nodes [f.top] ] [i] )
b=1;
}
if(!b)
{
cout<<f.nodes[f.top]<<" ";
f.top--;
}
else
{
f.top--;
DFS(f.nodes[f.top+1]);
}
}
}




int main()
{
int m,s,t,start=1,count=0;


cin>>n>>m;
memset(A,0,sizeof(A));
for(int i=1;i<=m;i++)
{
cin>>s>>t;
A[s][t]++;
A[t][s]++;


}


for(int i=1;i<=n;i++)
{
int sum=0;
for(int j=1;j<=n;j++)
{
sum+=A[i][j];
}
if(sum%2==1)
{
count++;
start=i;
}


}


if(count==0||count==2)
Euler(start);
else
cout<<"There's no Euler path"<<endl;







return 0;
}


对于半欧拉图也是可行的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值