广度优先搜索的应用

时间:2014-01-15 13:52:46

标签: c++ algorithm graph graph-algorithm

我正试图解决这个问题:
http://www.spoj.com/problems/FINDPATH/
不知道它出了什么问题。
首先,我忽略了所有不是目的地除数的a [i],即N
我正在维护一个地图,将每个数字映射到它的父节点和距根节点的距离。 然后我的想法是,我将从' 1'做一个bfs。然后,
我只考虑那些(q.top()* a [i])< = N,
然后,如果queue包含(q.top()* a [i])则更新距离(q.top()* a [i])
如果距离(q.top())+ 1<距离(q.top()* a [i])
否则,如果距离相等,则如果(q.top()< parent(q.top()* a [i])) 然后更新更新父级(q.top()* a [i])= q.top()
否则,如果队列不包含(q.top()* a [i]),那么我只是将其推入队列。

最后,如果地图中存在节点N,则使用回溯打印距离然后打印路径。 这是我的代码:

int main() {
ll int n, m;
ll int x, top;
map<ll int, pair<ll int, ll int> >::iterator it, topit;

while (scanf("%lld %lld", &n, &m) != EOF) {
    ve(ll int) v;
    lp (i, 0, m) {scanf("%lld", &x); if (n % x == 0) v.pb(x);}
    m = v.size();
    map<ll int, pair<ll int, ll int> > s;

    s.insert(mp(1, mp(1, 0)));
    queue<ll int> q;
    q.push(1);
    while (!q.empty()) {
        top = q.front();
        q.pop();
        topit = s.find(top);
        lp (i, 0, m) {
            if (top * v[i] <= n) {
                it = s.find(top * v[i]);
                if (it != s.end()) {
                    if ((*it).second.second > (*topit).second.second + 1) {
                        (*it).second.second = (*topit).second.second + 1;
                        (*it).second.first = top;
                    } else if ((*it).second.second == (*topit).second.second + 1) {
                        if (top < (*it).second.first) (*it).second.first = top;
                    }
                } else {
                    s.insert(mp(top * v[i], mp(top, (*topit).second.second + 1)));
                    q.push(top * v[i]);
                }
            }
        }
    }

    it = s.find(n);
    ve(ll int) ans;
    ans.pb(n);
    if (it == s.end()) {
        printf("-1\n");
    } else {
        printf("%lld\n", (*it).second.second);
        while ((*it).second.first != 1) {
            ans.pb((*it).second.first);
            it = s.find((*it).second.first);
        }
        ans.pb((*it).second.first);
        lpd (i, ans.size() - 1, 0) printf("%lld ", ans[i]);
        printf("\n");
    }
}

return 0;

}

注意:
1)lp(i,0,m):for(int i = 0; i&lt; m; i ++)
2)pb:push_back
3)ll:long long
4)lpd(i,n,0):for(int i = n; i&gt; = 0; i--)

我的方法有错误吗?

0 个答案:

没有答案