给你一些边,如果存在欧拉路径就打出来
我的代码如下:
#include<iostream> #include<cstring> using namespace std; int dot[110],vis[110],degree[110],num_side,num_dot,no,road[110][110],st; struct node { int a,b; }side[110],step[110]; void init() { int i; num_dot=no=0; memset(degree,0,sizeof(degree)); memset(vis,0,sizeof(vis)); memset(road,0,sizeof(road)); scanf("%d",&num_side); for(i=0;i<num_side;i++) { scanf("%d%d",&side[i].a,&side[i].b); degree[side[i].a]++,degree[side[i].b]++; road[side[i].a][side[i].b]++,road[side[i].b][side[i].a]++; if(!vis[side[i].a]) dot[num_dot++]=side[i].a,vis[side[i].a]=1; if(!vis[side[i].b]) dot[num_dot++]=side[i].b,vis[side[i].b]=1; } } bool ispath() { int sum=0,i; st=dot[0]; for(i=0;i<num_dot;i++) if(degree[dot[i]]&1) { st=dot[i]; sum++; if(sum>2) return 0; } return 1; } void dfs(int s) { int i; for(i=0;i<num_dot;i++) if(road[s][dot[i]]>0) { road[s][dot[i]]--,road[dot[i]][s]--; dfs(dot[i]); step[no].a=s,step[no].b=dot[i],no++; } } void showstep() { int i,j,flag; memset(vis,0,sizeof(vis)); for(i=no-1;i>-1;i--) for(j=0;j<num_side;j++) if(!vis[j]) { if(side[j].a==step[i].a&&side[j].b==step[i].b) flag=1; else if(side[j].a==step[i].b&&side[j].b==step[i].a) flag=2; else flag=0; if(flag!=0) { printf("%d %c\n",j+1,flag==1?'+':'-'); vis[j]=1; break; } } } int main() { init(); if(ispath()) { dfs(st); if(no<num_side) { printf("No solution\n"); return 0; } showstep(); } else printf("No solution\n"); }
原文地址:http://blog.csdn.net/stl112514/article/details/37571803