您的位置:首页 > 其它

HDU 4337 King Arthur's Knights——回溯法

2014-05-31 16:59 260 查看
题目链接点击打开链接

此题我用dfs回溯,百度到有更牛逼的算法,鉴于水平不行,还是用会的dfs吧……做题

有几个失误,导致一直得不到结果

1.变量i被我声明成了全局变量……所以在回溯时,i的值变了……

2.判断语句是 if(rela[a[cur-1]][i]&&!vis[i]) 而不是 if(rela[cur-1][i]&&!vis[i])……

或者将dfs声明为dfs(int x,int cur) x记录a[cur-1],cur记录当前到了第几个数。

3.最终cur=n+1。

4.最后一个空格不要输出,否则会错……

AC代码
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<stdlib.h>
#include<set>
#include<map>
#include<queue>
using namespace std;
int a[1000],rela[1000][1000],vis[1000];
int n,m,flag=0;
void dfs(int cur)
{
    if(flag) return ;
    if(rela[1][a
]&&cur==n+1)
    {
        for(int i=1; i<=n; i++)
        {
            cout<<a[i];
            i==n? cout<<endl:cout<<" ";
        }
        flag=1;
    }

    else
    {
        for(int i=2; i<=n; i++)
        {
            if(rela[a[cur-1]][i]&&!vis[i])
            {
                a[cur]=i;
                vis[i]=1;
                dfs(cur+1);
                vis[i]=0;
            }

        }
    }
}
int main()
{

    while(cin>>n>>m)
    {
        memset(vis,0,sizeof(vis));
        memset(rela,0,sizeof(rela));
        for(int i=0; i<m; i++)
        {
            int a,b;
            cin>>a>>b;
            rela[a][b]=1;
            rela[b][a]=1;
        }
        flag=0;
        a[1]=1;
        dfs(2);
        if(flag==0) cout<<"no solution\n";
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: