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

来源:互联网 发布:python开发网站实例 编辑:程序博客网 时间:2024/04/28 22:22

题目链接点击打开链接


此题我用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[n]]&&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;}




0 0