算法思路:1.欧拉回路都是偶点,无奇点
2.欧拉路只有两个奇点(起点和终点),其余都是偶点
3.给定样例数据一定存在两者之中的一种
4.欧拉路包括欧拉回路
#include<iostream>
using namespace std;
void CircleDFS(int a);
int m,n;//m为点数,n为边数
bool graph[1000][1000];//邻阶矩阵
int nodedu[1000];//节点的度(用于判断是奇点还是偶点)
int passed[1000];// 记录路径
int numbe;//路径Node数量
int main() {
cin>>m>>n;
for(int i=1; i<=n; i++) {
int a,b;
cin>>a>>b;
graph[a][b]=true;//存储到邻接矩阵
graph[b][a]=true;
nodedu[a]++;//统计节点度
nodedu[b]++;
}
int start;//search初始点
for(int i=1; i<=n; i++) {
if(nodedu[i]%2!=0) {
start=i;//发现奇点
break;
}
}
CircleDFS(start);//有基点找路,无基点找环
//cout<<numbe<<endl;
for(int i=1; i<=numbe; i++)
cout<<passed[i]<<" ";
return 0;
}
void CircleDFS(int a) { //从a节点开始搜索
for(int i=1; i<=n; i++) {
if(graph[a][i]==true) { //有路径
graph[a][i]=false;//如果走到了,删除节点避免重复
//如果没有走到,则说明这个点开始永远不可能走到,则断开路径,避免重复
graph[i][a]=false;
CircleDFS(i);//如果走到无法再走(没有路径)的时候返回
/*无路径即已经走到尾 :
证明:上已有如果该点开始走不到(或已经走过)结尾,则该点通路断开,则连接的是可以到达或没有实验的
此时没有通路,则说明已到达结尾
*/
}
}
numbe++;
passed[numbe]=a;//递归归时统计路径,不必像递时POP元素(况且图的走法顺序不限)
}
京公网安备 11010502036488号