波波老师您好,这是我用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回答
-
回溯法目测没有问题。不过回溯法是指数级别的哦:)
继续加油!:)
012020-10-28
相似问题