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

概念

“哈密尔顿回路问题”是访问除原出发结点以外的每个结点一次且仅一次,而“欧拉回路问题”是访问每条边一次且仅一次

欧拉回路与欧拉路

PS:已经判断此图有欧拉路或欧拉回路

#include
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<

哈密尔顿环

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

转载于:https://www.cnblogs.com/BrokenString/p/9279541.html

你可能感兴趣的:(【算法】欧拉(回)路与哈密尔顿环)