算法思路: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元素(况且图的走法顺序不限) }