几何图形还原
思路:
根据题意,我们必须保证字典序,因此我们可以从结点1开始枚举,这样就能保证我们找出的第一组解是最小字典序。然后,从各个点开始,依次枚举各点所连接的边,并进行回溯,找到一组解后输出,答案即为所求。但必须保证解的第一个点和最后一个点是有连边的,否则无法形成图形。
代码如下:
#include<bits/stdc++.h>//flag表示是否需要退出
using namespace std;
int vis[60],f[60],a[60][60],n,xx,yy,flag=0;
void out()//输出
{
for(int i=1;i<n;i++)
cout<<f[i]<<' ';
cout<<f[n]<<endl;
flag=1;
}
void dfs(int k)
{
if(k==n&&a[f[k]][f[1]]) //如果每条边都搜过,并且第一个点与最后的点相连,那么说明这组解成立,输出。
{
out();
return ;
}
for(int i=1;i<=n;i++)
{
if(a[f[k]][i]&&!vis[i])//按字典序找到最小的没有遍历过的与k结点的连边,进行遍历,将这条边的y结点存入答案数组中
{
vis[i]=1;
f[k+1]=i;//将结点存入答案中
dfs(k+1);//遍历下一个结点
if (flag) return ;
vis[i]=0; //回溯
}
}
}
int main()
{
cin>>n;
while(~scanf("%d",&xx))//建邻接矩阵
{
scanf("%d",&yy);
a[xx][yy]=1;
a[yy][xx]=1;
}
f[1]=1;//从结点1开始遍历
vis[1]=1;//访问过结点1
dfs(1);//遍历
return 0;
}
注意:
读入的时候需要小心些,以上读入方法需要文件输入输出,否则会显示读入未完成,在检测样例时可以按样例给的组数输入运行,提交时改正即可。