题意:
项链散了 每个珠子前端后端分别有颜色 在项链中 相邻的珠子的相邻的那一端颜色相同 问 找到的珠子能不能重新串起一根项链
思路:
比较经典的欧拉回路题 Fleury算法解决问题
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define M 60 int n,ans,top,m,t,T; int Edge[M][M],path[M*M],d[M]; struct Stack { int node[M*M]; int top; }s; void dfs(int x) { for(int i=1;i<=n;i++) { if(Edge[i][x]) { Edge[i][x]--; Edge[x][i]--; s.node[++s.top]=i; dfs(i); break; } } } void Fleury(int x) { int i,b; top=0; s.top=0; s.node[0]=x; while(s.top>=0) { b=0; for(i=1;i<=n;i++) { if(Edge[s.node[s.top]][i]) { b=1; break; } } if(b==0) path[top++]=s.node[s.top--]; else dfs(s.node[s.top]); } } int main() { int i,u,v; n=50; scanf("%d",&T); for(t=1;t<=T;t++) { if(t!=1) puts(""); printf("Case #%d\n",t); memset(d,0,sizeof(d)); memset(Edge,0,sizeof(Edge)); scanf("%d",&m); for(i=1;i<=m;i++) { scanf("%d%d",&u,&v); d[u]++; d[v]++; Edge[u][v]++; Edge[v][u]++; } for(i=1;i<=n;i++) { if(d[i]%2==1) break; } if(i<=n) { puts("some beads may be lost"); continue; } for(i=1;i<=n;i++) { if(d[i]) break; } Fleury(i); for(i=0;i<top;i++) d[path[i]]=0; for(i=1;i<=n;i++) { if(d[i]) break; } if(i<=n) { puts("some beads may be lost"); continue; } for(i=1;i<top;i++) printf("%d %d\n",path[i-1],path[i]); } return 0; }
原文地址:http://blog.csdn.net/houserabbit/article/details/38929521