本题先要判断是否是欧拉回路(判断是否连通,是否相关点都是偶数),然后把路输出就行了。
错误代码
#include <iostream>
#include <cstring>
#include<cstdio>
#include <queue>
using namespace std ;
struct node
{
int x,y;
};
node a[2000],cun[2000];
int flag,cen,n,wei;
int vis[2000];
void judge(int lian)
{ cout<<cen<<endl;
cen++;
if(cen==n)
{
flag=1;
return;
}
int i;
for(i=0; i<n; ++i)
{
if(lian==a[i].x&&vis[i]==0 )
{
cun[cen].x=a[i].x;
cun[cen].y=a[i].y;
vis[i]=1;
wei=a[i].y;
cout<<cun[cen].x<<" "<<cun[cen].y<<endl;
judge(a[i].y);
return;
}
else if(lian==a[i].y&&vis[i]==0)
{
cun[cen].x=a[i].y;
cun[cen].y=a[i].x;
vis[i]=1;
wei=a[i].x;
cout<<cun[cen].x<<" "<<cun[cen].y<<endl;
judge(a[i].x);
return;
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
int t;
int casei=1;
scanf("%d",&t);
while(t--)
{
if(casei!=1)printf("\n");
memset(vis,0,sizeof(vis));
flag=0;
int i;
scanf("%d",&n);
for(i=0; i<n; ++i)
{
scanf("%d%d",&a[i].x,&a[i].y);
}
cen=0;
int dian=a[0].y;
vis[0]=1;
cun[0]=a[0];
//cun[0].x=a[0].x;
//cun[0].y=a[0].y;
judge(dian);
printf("Case #%d\n",casei++);
if(flag&&wei==a[0].x)
{
for(i=0; i<n; ++i)
{
printf("%d %d\n",cun[i].x,cun[i].y);
}
}
else
{
printf("some beads may be lost\n");
}
}
return 0 ;
}
/*过不去的数据 我的judge()函数有个致命缺点,下面数据运行后,第一个50 49,第二个49 50,三50 49,四49 50,剩个49 49插不进去了
5
50 49
49 50
50 49
49 50
49 49
*/
//改正后的正确代码
#include <iostream>
#include <cstring>
#include<cstdio>
#include <queue>
using namespace std ;
struct node
{
int x,y;
};
node a[2000],cun[2000];
int flag,cen,n,wei,pi;
int vis[2000];
void judge(int lian)
{ // cout<<cen<<endl;
cen++;
if(cen==n)
{
flag=1;
return;
}
int i;
for(i=0; i<n; ++i)
{
if(lian==a[i].x&&vis[i]==0 )
{
vis[i]=1;
//wei=a[i].y;
judge(a[i].y);
cun[pi].x=a[i].x;
cun[pi].y=a[i].y;
// cout<<cun[pi].x<<" "<<cun[pi].y<<endl;
pi++;
// return;
}
else if(lian==a[i].y&&vis[i]==0)
{
vis[i]=1;
wei=a[i].x;
judge(a[i].x);
cun[pi].x=a[i].y;
cun[pi].y=a[i].x;
// cout<<cun[pi].x<<" "<<cun[pi].y<<endl;
pi++;
// return;
}
}
}
int f[100];
int find(int x )
{
return f[x]==x?x:f[x]=find(f[x]);
}
void liantong()
{
int i;
for(i=0;i<55;++i)f[i]=i;
for(i=0;i<n;++i)
{
int e=find(a[i].x );int v=find(a[i].y);
if(e!=v)
{
f[e]=v;
}
}
int ans=find(a[0].x);
for(i=1;i<n;++i)
{
if(ans!=find(a[i].x)||ans!=find(a[i].y))
{
flag=0;
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
int t;
int casei=1;
scanf("%d",&t);
while(t--)
{
if(casei!=1)printf("\n");
memset(vis,0,sizeof(vis));
flag=1;
int i;
int shu[100]={0};
scanf("%d",&n);
for(i=0; i<n; ++i)
{
scanf("%d%d",&a[i].x,&a[i].y);
++shu[a[i].x];
++shu[a[i].y ];
}
for(i=0;i<55;++i)
{
if(shu[i]%2==1)flag=0;
}
printf("Case #%d\n",casei++);
if(flag==0)
{
printf("some beads may be lost\n");continue;
}
liantong();
if(flag==0)
{
printf("some beads may be lost\n");continue;
}
cen=0;
int dian=a[0].y;
vis[0]=1;
pi=0;
//cun[0].x=a[0].x;
//cun[0].y=a[0].y;
judge(dian);
cun[pi]=a[0];
pi++;
if(flag)
{
for(i=n-1; i>=0; --i)
{
printf("%d %d\n",cun[i].x,cun[i].y);
}
}
else
{
printf("some beads may be lost\n");
}
}
return 0 ;
}