题意:问你这些数字是否能串成一串。。无向图的欧拉回路,但其实,你会发现它比欧拉还要简单的是,如果可能串成一串的话,那就是每个边只出现一次,所以我们每次捡一条边放进栈里就可以了。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
int n,map[60][60];
struct edge
{
int x,y;
};
stack<edge>s;
void euler(int m)
{
int i;
for(i = 1 ; i <= 50 ; i++)
if(map[m][i] > 0)
{
map[m][i]--;
map[i][m]--;
euler(i);
edge t;
t.x = m;
t.y = i;
s.push(t);
}
}
int main()
{
int t,f,x,y,i,j,k;
scanf("%d",&t);
for (k = 1 ; k <= t ; k++)
{
while (!s.empty())
s.pop();
memset(map,0,sizeof(map));
f = 0 ;
scanf("%d",&n);
for (i = 1 ; i <= n ; i++)
{
scanf("%d%d",&x,&y);
map[x][0]++;
map[y][0]++;
map[x][y]++;
map[y][x]++;
}
for ( i = 1 ; i <= 50 ; i++) //欧拉回路的判断
{
f = map[i][0] % 2 ;
if (f)
break;
}
printf("Case #%d\n",k);
if (f)
printf("some beads may be lost\n");
else euler(x);
while (!s.empty())
{
printf("%d %d\n",s.top().x,s.top().y);
s.pop();
}
if(k < t )
printf("\n");
}
return 0;
}