题意:
项链散了 每个珠子前端后端分别有颜色 在项链中 相邻的珠子的相邻的那一端颜色相同 问 找到的珠子能不能重新串起一根项链
思路:
比较经典的欧拉回路题 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