洛谷 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]<<" "; }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。