几何图形还原

几何图形还原

思路:

根据题意,我们必须保证字典序,因此我们可以从结点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;
} 

注意:

读入的时候需要小心些,以上读入方法需要文件输入输出,否则会显示读入未完成,在检测样例时可以按样例给的组数输入运行,提交时改正即可。

猜你喜欢

转载自blog.csdn.net/smileyx2005/article/details/80306899
今日推荐