p1209 几何图形还原

版权声明: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;
}

猜你喜欢

转载自blog.csdn.net/huashuimu2003/article/details/84501093
今日推荐