欧拉回路:简单来说,就是经过图G的每条边一次且仅一次,回到出发点的路径就叫欧拉回路;
我就直接上模板了。。。。

1 #include<iostream> 2 #include<stack> 3 const int MAXN=111; 4 using namespace std; 5 6 stack<int>S; 7 int edge[MAXN][MAXN]; 8 int n,m; 9 10 void dfs(int x){ 11 S.push(x); 12 for(int i=1;i<=n;i++){ 13 if(edge[x][i]>0){ 14 edge[i][x]=edge[x][i]=0;//删除此边 15 dfs(i); 16 break; 17 } 18 } 19 } 20 21 //Fleury算法的实现 22 void Fleury(int x){ 23 S.push(x); 24 while(!S.empty()){ 25 int b=0; 26 for(int i=1;i<=n;i++){ 27 if(edge[S.top()][i]>0){ 28 b=1; 29 break; 30 } 31 } 32 if(b==0){ 33 printf("%d",S.top()); 34 S.pop(); 35 }else { 36 int y=S.top(); 37 S.pop(); 38 dfs(y);//如果有,就dfs 39 } 40 } 41 printf("\n"); 42 } 43 44 int main(){ 45 scanf("%d%d",&n,&m); //读入顶点数以及边数 46 memset(edge,0,sizeof(edge)); 47 int x,y; 48 for(int i=1;i<=m;i++){ 49 scanf("%d%d",&x,&y); 50 edge[x][y]=edge[y][x]=1; 51 } 52 //如果存在奇数顶点,则从奇数顶点出发,否则从顶点0出发 53 int num=0,start=1; 54 for(int i=1;i<=n;i++){ //判断是否存在欧拉回路 55 int degree=0; 56 for(int j=1;j<=n;j++){ 57 degree+=edge[i][j]; 58 } 59 if(degree&1){ 60 start=i,num++; 61 } 62 } 63 if(num==0||num==2){ 64 Fleury(start); 65 }else 66 printf("No Euler Path\n"); 67 return 0; 68 }