您的位置:首页 > 其它

Gym 100518E Embedding Caterpillars

2015-09-08 17:34 267 查看
构造+DFS

很容易的可以构造两个,最后一个不会构造的话 DFS一下就可以了

#include<iostream>
#include<string>
#include<string.h>
#include<stdio.h>
#include<queue>
#include<iomanip>
#include<algorithm>
#include<map>
using namespace std;

int n;
int G[205][205];
int flag[205];
int ans[205];
int TOT,FF;

void dfs(int now)
{
if(now==2*n+1)
{
for(int i=1; i<=2*n; i++) printf("%d ",ans[i]);
FF=1;
return;
}
if(now==1)
{
for(int i=1; i<=2*n; i++)
{
if(!flag[i])
{
flag[i]=1;
ans[now]=i;
dfs(now+1);
if(FF) return;
flag[i]=0;
}
}
}
else if(now>=2&&now<=n+1)
{
for(int i=1; i<=2*n; i++)
{
if(!flag[i]&&!G[i][ans[now-1]])
{
flag[i]=1;
ans[now]=i;
dfs(now+1);
if(FF) return;
flag[i]=0;
}
}
}
else if(now>=n+2&&now<=2*n)
{
for(int i=1; i<=2*n; i++)
{
if(!flag[i]&&!G[i][ans[now-n]])
{
flag[i]=1;
ans[now]=i;
dfs(now+1);
if(FF) return;
flag[i]=0;
}
}
}
}

int main( )
{
freopen("embedding.in","r",stdin);
freopen("embedding.out","w",stdout);
while(~scanf("%d",&n))
{
if(n==0) break;
TOT=1;
for(int i=1; i<=2*n; i++) ans[TOT]=i,TOT++;
TOT--;
for(int i=1; i<=TOT; i++) printf("%d ",ans[i]);
printf("\n");
for(int i=1; i<=n; i++) G[ans[i]][ans[i+1]]=1,G[ans[i+1]][ans[i]]=1;
for(int i=2; i<=n; i++) G[ans[i]][ans[i+n]]=1,G[ans[i+n]][ans[i]]=1;
TOT=1; ans[TOT]=1; TOT++;
for(int i=n+2; i<=2*n; i++) ans[TOT]=i,TOT++;
ans[TOT]=n+1; TOT++; ans[TOT]=n; TOT++;
for(int i=2; i<=n-1; i++) ans[TOT]=i,TOT++;
TOT--;
for(int i=1; i<=TOT; i++) printf("%d ",ans[i]);
printf("\n");
for(int i=1; i<=n; i++) G[ans[i]][ans[i+1]]=1,G[ans[i+1]][ans[i]]=1;
for(int i=2; i<=n; i++) G[ans[i]][ans[i+n]]=1,G[ans[i+n]][ans[i]]=1;
FF=0;
memset(flag,0,sizeof flag);
dfs(1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: