#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=200;
int str[N],m[N][N],vis[N];
int n,k;
void rev(int s,int t)
{
while(s<t)
{
swap(str[s],str[t]);
s++,t--;
}
}
int extend(int &num)
{
int i;
while(1)
{
for(i=1;i<=n;i++)if(m[str[num]][i]&&!vis[i])
{
str[++num]=i;
vis[i]=1;
}
if(i>n)break;
}
rev(0,num);
while(1)
{
for(i=1;i<=n;i++)if(m[str[num]][i]&&!vis[i])
{
str[++num]=i;
vis[i]=1;
}
if(i>n)break;
}
}
void cir(int &num)
{
for(int i=1;i<num;i++)
{
if(m[str[0]][str[i+1]]&&m[str[i]][str[num]])
{
rev(0,i);
break;
}
}
}
void addone(int &num)
{
int i,j;
for(i=1;i<=n;i++)if(!vis[i])
{
for(j=1;j<num;j++)if(m[str[j]][i])
{
rev(0,j-1);
rev(j,num);
vis[i]=1;
}
if(vis[i])
{
str[++num]=i;
break;
}
}
}
void solve(int s,int t)
{
int num=1,i,j;
str[0]=s,str[1]=t;
vis[s]=vis[t]=1;
while(1)
{
extend(num);
if(!m[str[0]][str[num]])cir(num);
if(num==n-1)break;
addone(num);
}
for(int i=0;i<num;i++)
printf("%d ",str[i]);
printf("%d\n",str[num]);
}
int main()
{
int a,b;
while(~scanf("%d%d",&n,&k))
{
memset(m,0,sizeof(m));
memset(vis,0,sizeof(vis));
for(int i=0;i<k;i++)
{
scanf("%d%d",&a,&b);
m[a][b]=m[b][a]=1;
}
for(int i=2;i<=n;i++)if(m[1][i])
{
solve(1,i);break;
}
}
return 0;
}
HDU 4337 King Arthur's Knights 稠密图构造汉密尔顿回路
最新推荐文章于 2015-08-11 14:28:06 发布