算法欧拉(回)路与哈密尔顿环

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);
        }
    }
}

以上是关于算法欧拉(回)路与哈密尔顿环的主要内容,如果未能解决你的问题,请参考以下文章

欧拉路径与汉密尔顿路径的区别?

哈密尔顿环问题

哈密​​顿路径和欧拉路径的区别

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

哈密顿回路算法详解

noip提高组复赛所需掌握的东西