波波老师您好,这是我用DFS你讲的第一种方法做的欧拉回路,请帮忙看下对不对?

来源:10-4 求解欧拉回路的三种算法

慕仰0554757

2020-10-27

#include<bits/stdc++.h>
using namespace std;
int mapp[1005][1005];
int n,m;
int s[105];
int c=0;
int num[2005];
void pr(){
	int i;
	for(i=1;i<=c;i++) cout<<num[i]<<" ";
	cout<<num[1];
	cout<<endl;
	return ;
}
void dfs(int i){
    for(int j=1;j<=n;j++){            //遍历所有节点
        if(mapp[i][j]==1){
            mapp[i][j]=mapp[j][i]=0;   //裁掉顶点i和顶点j的线
			num[++c]=i;
            if (c==m) {                //变量所有的边数m
				pr(); 
			} 
			else dfs(j);
            mapp[i][j]=mapp[j][i]=1;   //回溯,连上i和j的线
            --c; 
        }
    }
    
}
int main()
{
    memset(mapp,0,sizeof(mapp)); //2维数组存图
    cin>>n>>m;
    for(int i=1;i<=m;i++){
	     int a,b;
        cin>>a>>b;
        mapp[a][b]=mapp[b][a]=1;  
        s[a]++;
        s[b]++;
    }
    int flag=1;
    for(int i=1;i<=n;i++){  //从度为奇数的出发
        if(s[i]%2==1){
            flag=i;
        }
    }
    dfs(flag);  
    return 0;
}
/*
5 5
1 2
2 3
3 4
4 5
5 1
1 2 3 4 5 1
1 5 4 3 2 1
我这题的解是欧拉回路的两种方案:

*/
 
写回答

1回答

liuyubobobo

2020-10-28

回溯法目测没有问题。不过回溯法是指数级别的哦:)


继续加油!:)

0
1
慕仰0554757
非常感谢!bobo
2020-10-28
共1条回复

玩转算法系列--图论精讲(Java版)

30+小时系统学习,bobo带你克服被图论支配的恐惧

1591 学习 · 324 问题

查看课程