版权声明:https://blog.csdn.net/huashuimu2003 https://blog.csdn.net/huashuimu2003/article/details/84501093
题目
描述 Description
小修是个几何迷。她有一天画了一个正n边形,并且将n个顶点用1,2,…,n这n个连续自然数随手编了一下号。然后她又画了一些不相交的对角线。如下图:
她把所有的边和对角线都写在一张纸上。对上图,她写了:(1,3), (3,2), (2,4), (4,5), (5,1), (1,4), (3,4)。
过了几个星期,她无意中发现了这张写着字的纸,可是怎么也找不着那个几何图形了。她很想把n边形的编号复原,可是试了一天也没弄出来。你能帮助她吗?
输入格式 Input Format
第一行n(n<=50)。
下面的若干行每行两个数a, b。表示纸上写着(a,b)。
输出格式 Output Format
仅一行,按顺序依次输出顶点的编号。对于上面的例子,你的输出应该是1 3 2 4 5。
1 5 4 2 3也是符合题目要求的。两者区别只是逆时针和顺时针而已。
但是你的输出只能是1 3 2 4 5!也就是说你必须把两个符合要求的输出比较大小(先比较第一位;第一位相等就比较第二位;第二位相等……以此类推),你的输出应该是较小者!(这是为了评测的方便)
样例输入 Sample Input
5
1 3
3 2
2 4
4 5
5 1
1 4
3 4
样例输出 Sample Output
1 3 2 4 5
时间限制 Time Limitation
1s
代码
#include<bits/stdc++.h>
using namespace std;
const int maxnum = 5000;
int n, x, y, cnt=0, f[maxnum];
bool v[maxnum], a[maxnum][maxnum], flag;
bool check ()
{
for (int i = 1; i <= n; i++)
if (!v[i]) return 0;
return 1;
}
void dfs (int k)
{
if (k == 1 && check())
{
flag = 1;
return ;
}
for (int i = 1; i <= n; i++)
if (a[k][i] && (!v[i]))
{
a[i][k] = a[k][i] = 0;
v[i] = 1;
dfs(i);
if (flag == 1 && i != 1)
{
f[++cnt] = i;
return ;
}
a[i][k] = a[k][i] = 1;
v[i] = 0;
}
}
int main()
{
// freopen("xf.in","r",stdin);
// freopen("xf.out","w",stdout);
cin>>n;
memset(a, 0, sizeof(a));
memset(v, 0, sizeof(v));
while(cin >> x >> y)
a[x][y] = a[y][x] = 1;
dfs(1);//遍历
cout << 1 << ' ';
for (int i = cnt; i >= 1; i--)
cout << f[i] << ' ';
cout << endl;
return 0;
}