欧拉回路,先判断其连通性和每个节点的度数的奇偶性(本题中所有节点都应为偶数),如果是欧拉回路则DFS输出结果,注意:每个“珍珠”的两个数字是可以交换的,看第二组样例就会了解 ~
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int p[50+2];
void dfs(int u,int ffio[52][52]) // dfs输出结果
{
int v;
for(v = 1; v <= 50 ; v++)
if(ffio[u][v])
{
ffio[u][v]--;
ffio[v][u]--;
dfs(v,ffio);
printf("%d %d\n",v,u);
}
}
int find(int x) //连通性判断
{
return p[x] == x ? x : find(p[x]);
}
int main()
{
#ifdef state
freopen("sample.txt","r",stdin);
#endif
int num,count,i,cct=1;
int a[1000+2][3],io[50+2],ffio[50+2][50+2];
scanf("%d",&count);
while(count--)
{
int flag = 0,min = 100;
memset(a,0,sizeof(a));
memset(io,0,sizeof(io));
memset(ffio,0,sizeof(ffio));
scanf("%d",&num);
for(i = 1; i <= 50; i++)
p[i] = i;
for(i = 0; i < num ; i++)
{
scanf("%d%d",&a[i][0],&a[i][1]);
int p_in = a[i][0] , p_out = a[i][1];
if(a[i][0] < min)
min = a[i][0];
if(a[i][1] < min)
min = a[i][1];
io[p_in]++;
io[p_out]++;
ffio[p_in][p_out]++;
ffio[p_out][p_in]++;
p_in=find(p_in);
p_out=find(p_out);
if(p_in != p_out)
p[p_in] = p_out;
}
int ok = 1;
int t = find(min);
for( i++; i <= 50 ; i++ )
if(io[i] && find(i) != t)
{
ok = 0;
break;
}
if(ok)
for( i = min; i <= 50; i++ )
if( io[i] % 2 ) //节点度数判断
{
flag = 1;
break;
}
printf("Case #%d\n",cct++);
if(flag || !ok)
printf("some beads may be lost\n");
else
dfs(min,ffio);
if(count)
puts("");
}
return 0;
}