看是否有欧拉回路 有的话打印路径
欧拉回路存在的条件:
如果是有向图的话
1.底图必须是连通图
2.最多有两个点的入度不等于出度 且一个点的入度=出度+1 一个点的入度=出度-1
如果是无向图的话
1.如果这个无向图的连通的 当最多只有两个度数为奇数的点 就一定有欧拉回路
当有两个度数为奇数的点的时候 一个为起点 一个为终点
//============================================================================ // Name : UVA.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #include <map> #include <vector> using namespace std; const int MAXN=1010; int F[60]; int find(int x) { if(F[x]==-1)return x; else return F[x]=find(F[x]); } void bing(int x,int y) { int t1=find(x); int t2=find(y); if(t1!=t2)F[t1]=t2; } int num[60]; int G[60][60]; void Traverse(int u) { for(int v=1;v<=50;v++) if(G[u][v]>0) { G[u][v]--; G[v][u]--; Traverse(v); printf("%d %d ",v,u); } } int main() { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); int T; int n; scanf("%d",&T); int iCase=0; while(T--) { if(iCase>0)printf(" "); iCase++; scanf("%d",&n); int u,v; memset(F,-1,sizeof(F)); memset(num,0,sizeof(num)); memset(G,0,sizeof(G)); for(int i=0;i<n;i++) { scanf("%d%d",&u,&v); num[u]++; num[v]++; bing(u,v); G[u][v]++; G[v][u]++; } bool flag=true; int temp=-1; for(int i=1;i<=50;i++) { if(num[i]==0)continue; if(num[i]%2) { flag=false; break; } if(temp==-1) { temp=find(i); continue; } if(temp!=find(i)) { flag=false; break; } } printf("Case #%d ",iCase); if(!flag) { printf("some beads may be lost "); continue; } for(int i=1;i<=50;i++) if(num[i]!=0) { u=i; break; } Traverse(u); } return 0; }