洛谷 P1718 图形复原

题目描述

HWX小朋友对几何的热爱在电脑组是出了名的,号称“每题必解”,这天,LXC在玩logo的时候突然想到了一个题目,刚好可以去测试一下他封号的虚实,于是,他logo编程画了一个n边形,并且将n个顶点用1,2,3,…,n这n个连续自然数随手编了个号,为了增加难度,他又画了一些不相交的对角线。如下图:

他把所有的边和对角线都写在一张纸上,对于上图,他写了:(1,3),(3,2),(2,4),(4,5),(5,1),(1,4),(3,4)。正得意的时候,电脑突然自动重启了,郁闷的是,他忘记保存刚才的logo程序了,此刻的他很想利用纸上记录的信息将这个n边形的编号复原,电脑组的你能帮助他吗?

输入输出格式

输入格式:

 

第一行n(n<=50)

下面若干行,每行两个数a,b,表示纸上记录的信息。

 

输出格式:

 

仅一行,按字典序较小的顺序依次输出顶点的编号。对于上面的例子,你的输出应该是1 3 2 4 5。

 

输入输出样例

输入样例#1: 复制
5
1 3
3 2
2 4
4 5
5 1
1 4
3 4
输出样例#1: 复制
1 3 2 4 5
思路:搜索。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int ans[60],vis[60],map[60][60];
bool dfs(int now,int tot){
    if(tot==n+1&&now==1)    return true;
    for(int i=1;i<=n;i++)
        if(map[now][i]&&!vis[i]){
            vis[i]=1;map[now][i]=map[i][now]=0;ans[tot]=i;
            if(dfs(i,tot+1))    return true;
            vis[i]=0;map[now][i]=map[i][now]=1;
        }
    return false;
}
int main(){
    scanf("%d",&n);
    int a,b;
    while(scanf("%d%d",&a,&b)!=EOF)
        map[a][b]=map[b][a]=1;
    dfs(1,1);
    cout<<"1"<<" ";
    for(int i=1;i<n;i++)
        cout<<ans[i]<<" ";
}

 

 
posted @ 2017-12-10 19:08  一蓑烟雨任生平  阅读(559)  评论(0编辑  收藏  举报