今天A掉了4道题呢……(掌声)
从今天开始,我大概就要开始步入动态规划的殿堂了(嗯嗯)。其中两道是智障一般的图论题,没什么可说的直接贴题。
P1209 几何图形还原
小修是个几何迷。她有一天画了一个正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<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<memory>
#include<algorithm>
#include<string>
#include<climits>
using namespace std;
int n,m,sum,s;
int ans[60];
bool all,is=false;
bool a[60][60]={
0},ar[60]={
0};
void dfs(int k,int set)
{
if(is==true)
return;
ans[set]=k;
for(int j=1;j<=n;j++)
{
if(a[k][j]==1 && k!=j && ar[j]==0)
{
ar[j]=1;
dfs(j,set+1);
ar[j]=0;
}
}
if(set==n && a[k][s]==1)
{
for(int j=1;j<=n;j++)
cout<<ans[j]<<' ';
is=true;
return;
}
}
int main()
{
//freopen("in.txt","r",stdin);
cin>>n;
for(int i=0;i<=n+n-3;i++)
{
int x,