#include<bits\stdc++.h> using namespace std; const int maxn=100; stack<int>s;/*输出欧拉回路*/ vector<int>way[maxn];/*记录与每个点相连接的点*/ int edge[maxn][maxn];/*记录两点是否联通*/ int in[maxn];/*记录每个度的入度*/ int fa[maxn];/*用做并查集查询图是否联通*/ int n,m; int flag; void init() { memset(edge,0,sizeof(edge)); memset(in,0,sizeof(in)); while(!s.empty())s.pop(); for(int i=0;i<=maxn;i++) { while(!way[i].empty()) way[i].clear(); } for(int i=0;i<maxn;i++) { fa[i]=i; } flag=1; } int root(int x) { while(fa[x]!=x) { x=fa[x]; } return x; } void merge(int x,int y) { int rx=root(x); int ry=root(y); if(rx!=ry) { fa[rx]=ry; } return; } void dfs(int x) { s.push(x); for(int i=0;i<way[x].size();i++) { int b=way[x][i]; if(edge[x][b]==1) { edge[x][b]=edge[b][x]=0; dfs(b); break; } } } void Fleury(int x)/*佛罗来算法*/ { s.push(x); while(!s.empty()) { flag=0; int a=s.top(); for(int i=0;i<way[a].size();i++) { int b=way[a][i]; if(edge[a][b]==1) { flag=1; break; } } if(flag==0) { s.pop(); cout<<a; } else { s.pop(); dfs(a); } } cout<<endl; } int main() { init(); scanf("%d %d",&n,&m);/*输入点数与边数*/ for(int i=0;i<m;i++) { int x,y; scanf("%d %d",&x,&y); edge[x][y]=edge[y][x]=1; way[x].push_back(y); way[y].push_back(x); in[x]++; in[y]++; merge(x,y);/*并查集连通*/ } int cnt=0;/*判断图是否联通*/ int degree=0;/*判断奇数入度点数*/ int start;/*记录欧拉路径起点*/ for(int i=1;i<=n;i++) { if(fa[i]==i) { cnt++; } if(in[i]%2==1) { degree++; start=i; } } if(cnt!=1||(degree!=0&°ree!=2)) { cout<<"No"<<endl; } else { Fleury(start); } }
原文:https://www.cnblogs.com/KasenBob/p/10458518.html