由于本题是Special Judge,表明只要输出一种答案即可。
哈密顿模板题。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1000;
int ans[maxn];
bool mapp[maxn][maxn];
bool visit[maxn];
void reverse(int s,int t)
{
int temp;
while(s<t)
{
temp=ans[s];
ans[s]=ans[t];
ans[t]=temp;
s++;
t--;
}
}
void Hamilton(int n)
{
int s=1,t;
int ansi=2;
int i,j,w,temp;
memset(visit,false,sizeof(visit));
for(i=1;i<=n;i++)
if(mapp[s][i]) break;
t=i;
visit[s]=visit[t]=true;
ans[0]=s;
ans[1]=t;
while(true)
{
while(true)
{
for(i=1;i<=n;i++)
{
if(mapp[t][i]&&!visit[i])
{
ans[ansi++]=i;
visit[i]=true;
t=i;
break;
}
}
if(i>n) break;
}
// cout<<"ansi="<<ansi<<endl;
w=ansi-1;
i=0;
reverse(i,w);
temp=s;
s=t;
t=temp;
while(true)
{
for(i=1;i<=n;i++)
{
if(mapp[t][i]&&!visit[i])
{
ans[ansi++]=i;
visit[i]=true;
t=i;
break;
}
}
if(i>n) break;
}
if(!mapp[s][t])
{
for(i=1;i<ansi-2;i++)
if(mapp[ans[i]][t]&&mapp[s][ans[i+1]]) break;
w=ansi-1;
i++;
t=ans[i];
reverse(i,w);
}
if(ansi==n) return;
for(j=1;j<=n;j++)
{
if(visit[j]) continue;
for(i=1;i<ansi-1;i++)
if(mapp[ans[i]][j]) break;
if(mapp[ans[i]][j]) break;
}
s=ans[i-1];
t=j;
reverse(0,i-1);
reverse(i,ansi-1);
ans[ansi++]=j;
visit[j]=true;
}
}
int main()
{
int n,m,i,j,a,b;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(m==0&&n==0) break;
n=n*2;
if(n==2)
{
cout<<1<<" "<<2<<endl;
continue ;
}
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
if(i!=j) mapp[i][j]=true;
else mapp[i][j]=false;
}
}
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
mapp[a][b]=mapp[b][a]=false;
}
/* for(int i=1;i<=2*n;i++)
{
for(int j=1;j<=2*n;j++)
{
cout<<mapp[i][j]<<" ";
}
cout<<endl;
}*/
//getchar();
Hamilton(n);
printf("%d",ans[0]);
for(int i=1;i<n;i++)
{
printf(" %d",ans[i]);
}
printf("\n");
}
return 0;
}