poj-3134 和路径有关的bfs

http://poj.org/problem?id=3134

题意是一个x的n次方,最快的运算个方式。。。不会做看题解是个IDDFS。。。太高深暂时先不研究,以后填坑。。

这里考虑一个BFS的做法,一开始以为直接记录父节点类似并查集那样的寻找相关然后记录最小值就可以了。。后来发现相等的时候父节点不一定取哪个最好,

这里学习了一个方法,在节点里面记录来的路径,由于自己不会算空间复杂度,还以为会爆炸,这里学习一下。。这样如果ans相等就也入队列就好了

然后就搜索就可以了,常数稍微好一点就水过了。。据说可以限制向上求的步数来加快。。暂时还不太理解。。

代码如下,暴力BFS水过。。。

#include <iostream>
#include <cmath>
#include <cstring>
#include <map>
#include <set>
#include <cstdio>
#include <deque>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

int ans[1101];

struct node{
    vector<int> s;
    int x;
    int val;
    node(){};
    node(int xx,int vv,vector<int> ss):x(xx),val(vv),s(ss){};
};


void bfs(){

    queue<node> Q;
    vector<int> v;
    v.push_back(1);
    Q.push(node(1,0,v));
    ans[1]=0;
    node ad;
    node x;
    while(!Q.empty()){
        x=Q.front();
        Q.pop();
        if(x.val!=ans[x.x])
            continue;
        for(int i=0;i<x.s.size();i++){
            if(x.x+x.s[i]>=1005)
                continue;
            if(ans[x.x+x.s[i]]>=x.val+1){
                ans[x.x+x.s[i]]=x.val+1;
                ad=x;
                ad.val=x.val+1;
                ad.x=x.x+x.s[i];
                ad.s.push_back(x.x+x.s[i]);
                Q.push(ad);
            }
        }
        for(int i=0;i<x.s.size();i++){
            if(x.x-x.s[i]<1)
                continue;
            if(ans[x.x-x.s[i]]>=x.val+1){
                ans[x.x-x.s[i]]=x.val+1;
                ad=x;
                ad.val=x.val+1;
                ad.x=x.x-x.s[i];
                ad.s.push_back(x.x-x.s[i]);
                Q.push(ad);
            }
        }
    }
}

int main()
{
    int n;
    memset(ans,0x3f3f3f3f,sizeof(ans));
    bfs();
    while(cin>>n){
        if(n==0)
            break;
        cout<<ans[n]<<endl;
    }
    return 0;
}



你可能感兴趣的:(poj-3134 和路径有关的bfs)