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

概念

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

欧拉回路与欧拉路

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

原文地址:https://www.cnblogs.com/BrokenString/p/9279541.html

时间: 2024-11-05 13:47:50

【算法】欧拉(回)路与哈密尔顿环的相关文章

哈密尔顿环

1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int start,length,x,n; 5 bool visited[101],v1[101]; 6 int ans[101], num[101]; 7 int g[101][101]; 8 void print() { 9 int i; 10 for (i = 1; i <= length; i++) 11 cout << '

哈密尔顿环问题

哈密尔顿环 欧拉回路是指不重复地走过所有路径的回路,而哈密尔顿环是指不重复地走过所有的点,并且最后还能回到起点的回路. 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int num[10001];//求一个点能过到达的边的数量 5 int map[1001][1001]; 6 int jztx[1001]; 7 int vis[1001]; 8 int now=1; 9 int ans[1001];

哈密尔顿环x

欧拉回路是指不重复地走过所有路径的回路,而哈密尔顿环是指不重复地走过所有的点,并且最后还能回到起点的回路. 代码如下: #include<iostream> #include<cstring> using namespace std; const int Maxn=1001; int start,lengt,x,n; bool visited[Maxn],v1[Maxn]; int ans[Maxn],num[Maxn]; int g[Maxn][Maxn]; void print

哈密尔顿环 dfs

( ⊙ o ⊙ ) 题目: (⊙v⊙)嗯,代码: 1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 5 const int N = 25; 6 int n, cnt; 7 int a[N][N]; 8 int v[N], p[N]; 9 10 void print(){ 11 printf("Route #%d: ", ++cnt);//路径条数 12 for(int i=1;

NYOJ 99单词拼接(有向图的欧拉(回)路)

1 /* 2 NYOJ 99单词拼接: 3 思路:欧拉回路或者欧拉路的搜索! 4 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 5 有向图的欧拉路:abs(In[i] - Out[i])==1(入度[i] - 出度[i])的节点个数为两个 6 有向图的欧拉回路:所有的节点都有In[i]==Out[i] 7 */ 8 #include<iostream> 9 #include<cstring> 10 #include<cs

poj 1386 有向图欧拉(回)路

判断是否存在欧拉(回)路,注意先要用并查集判断图是否连通. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int N = 26; 7 const int M = 1001; 8 int f[N]; 9 int degree[N]; 10 bool visit[N]; 11 char word[M]; 12 13 int fin

欧拉(回)路

如果一个图存在一笔画,则一笔画的路径叫做欧拉路,如果最后又回到起点,那么这个路径叫做欧拉回路. 这里有一个定义:奇点指跟这点相连的边数有奇数个的点,反之,有偶数个则称为偶点. 那么如何在一个图里寻找欧拉(回)路,存在两个定理: 1.存在欧拉路的条件:图是连通的,有且只有两个奇点 2.存在欧拉回路的条件:图是连通的,有0个奇点 所以,要寻找欧拉回路,对任意一个点执行深度优先遍历即可:寻找欧拉回路,则对一个奇点执行深度优先遍历,时间复杂度为O(m+n). 代码: 1 #include<iostrea

欧拉除了函数,还有个回路----图论之路之欧拉路径欧拉回路

首先我们来百度一下,欧拉路径以及回路的定义: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径.若该路径是一个圈,则称为欧拉(Euler)回路. 具有欧拉回路的图称为欧拉图(简称E图).具有欧拉路径但不具有欧拉回路的图称为半欧拉图. 通俗来说,就是欧拉路径就是图中的每条边经过却只经过一次的路径,而最后回到起点的路径就是欧拉回路. 那给你一个图怎么判断存不存在,欧拉路径或者欧拉回路呢 首先,判断图是不是连通的,这个就很简单了,dfs或者并查集都可以. 然后就是根据定理 欧

求逆元的四种算法(拓欧费马小线性推欧拉)

求逆元的四种算法 拓展欧几里得算法求逆元 上一篇博客中已经讲过拓展欧几里得算法,并且讲解了求逆元的原理.这里只列出代码 在要求逆元的数与p互质时使用 代码 //扩展欧几里得定理 int ex_gcd(int a,int b,int& x,int& y) { if(b==0) { x=1; y=0; return a; } int ans = ex_gcd(b,a%b,x,y); int tmp = x; x = y; y = tmp-a/b*y; return ans; } int cal