算法欧拉(回)路与哈密尔顿环
Posted brokenstring
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法欧拉(回)路与哈密尔顿环相关的知识,希望对你有一定的参考价值。
概念
“哈密尔顿回路问题”是访问除原出发结点以外的每个结点一次且仅一次,而“欧拉回路问题”是访问每条边一次且仅一次
欧拉回路与欧拉路
PS:已经判断此图有欧拉路或欧拉回路
#include<iostream>
using namespace std;
int g[101][101];
int du[101];
int lu[101];
int n,e,l,start,x,y;
int maxn,minn=99999;
int find(int i)
{
for(int j=1;j<=n;j++)
{
if(g[i][j]==1)
{
g[i][j]=0;//删除边 避免走第二次
g[j][i]=0;//如果有重边改为--
find(j);
}
}
lu[++l]=i;//记录路径
}
int main()
{
cin>>n>>e;
for(int i=1;i<=e;i++)
{
cin>>x>>y;
g[x][y]=1;//如果有重边改为++
g[y][x]=1;
du[x]++;
du[y]++;
maxn=max(maxn,max(x,y));//点编号的最大值
minn=min(minn,min(x,y));//点编号的最小值
}
start=1;
for(int i=1;i<=n;i++)
if(du[i]%2==1)//判断如果有奇点从奇点开始
start=i;
find(start);
for(int i=l;i>=1;i--)
cout<<lu[i];
}
哈密尔顿环
#include<iostream>
#include<cstring>
using namespace std;
bool flag[101];
bool v[101];
int n,e,start,x,l;
int a[101][101];
int lu[101];
int num[101];
void print()
{
for(int i=1;i<=l;i++)
cout<<lu[i]<<" ";
cout<<endl;
}
void dfs(int last,int i)
{
flag[i]=1;//标记走过
v[i]=1;//出现在图中
lu[++l]=i;//记录路径
for(int j=1;j<=num[i];j++)
{
if(a[i][j]==x&&a[i][j]!=last)//它可以回到头且不是第二个点就是一个环
{
lu[++l]=a[i][j];
print();
l--;
break;
}
if(flag[a[i][j]]==0)
dfs(i,a[i][j]);
}
l--;//回溯部分
v[i]=0;
}
int main()
{
cin>>n>>e;
for(int i=1;i<=e;i++)
{
int x,y;
cin>>x>>y;
a[x][++num[x]]=y;//每个点可以到达几个点
a[y][++num[y]]=x;
}
for(x=1;x<=n;x++)
{
if(v[x]==0)//如果没有出现在图中
{
l=0;
dfs(0,x);
}
}
}
以上是关于算法欧拉(回)路与哈密尔顿环的主要内容,如果未能解决你的问题,请参考以下文章