C ++ STL广度优先搜索

时间:2016-10-07 10:32:11

标签: c++ breadth-first-search

#include <queue>
#include <vector>
#include <iostream>
using namespace std;


int main() {
int x;
cin >> x;
for(int tt=0;tt<x;tt++)
    {
    //cout << "HI" << endl;
    int n, m;
    cin >> n >> m;
    vector< vector<int> > g(n);
    for(long j =0; j< m;j++)
        {
        int u , v;
        cin  >> u >> v;

        g[u-1].push_back(v-1);
        g[v-1].push_back(u-1);

    }

    int s;
    cin >> s;

    vector<int> out(n,-1);
    vector<int> visited(n,0);
    int value = 0;
    queue<int> q;
    q.push(s-1);
    q.push(-1);
    visited[s-1] =1;
    int flag =0;
    while(!q.empty())
        {
        int v = q.front();
        out[v] = value;
        q.pop();
        if(v == -1)
            {
            value += 6;
        }
        else{
            for(vector<int>::iterator it = g[v].begin(); it != g[v].end();it++)
                {
                if(visited[*it] == 0)
                    {
                    q.push(*it);
                    visited[*it] =1;
                }
            }
        }

    }
    //cout << "hello" << endl;
    for(int k =0; k<n; k++)
        {
        if(k!= s-1)
            {
            cout << out[k] << " ";
        }
    }
    cout << endl;
    //cout << "yo";
}
//cout << "you";
return 0;
}

如果起始节点只有第一级邻居,则此代码可以正常工作。为了使它适用于所有情况,当我改变

if(v == -1)
{
       value += 6;
}

if(v == -1)
{
     value += 6;
     if(!q.empty())
          q.push(-1);
} 

它现在甚至不适用于所有测试用例。然后程序被中止,来自黑客等级的错误消息是 *解决方案中的错误&#39;:双重免费或损坏(退出):0x00000000009e5cf0 *

我无法弄清楚为什么会这样。为什么在处理队列时for循环出现问题。

链接到黑客问题。

https://www.hackerrank.com/challenges/bfsshortreach

1 个答案:

答案 0 :(得分:1)

你需要

  1. 摆脱value,这不是必需的。
  2. 超出界限的矢量就在那里。什么是[-1]?
  3. 适当的缩进
  4. BFS总是在水平上访问。您不需要通过推送队列中的负值来维护它。
  5. 正确的代码是:

    #include <queue>
    #include <vector>
    #include <iostream>
    using namespace std;
    
    
    int main() {
        int x,n, m,u , v;
        cin >> x;
        for(int tt=0;tt<x;tt++){
            cin >> n >> m;
            vector< vector<int> > g(n);
            for(long j =0; j< m;j++){
                cin  >> u >> v;
                g[u-1].push_back(v-1);
                g[v-1].push_back(u-1);
            }
    
            int s;
            cin >> s;
    
            vector<int> out(n,-1);
            vector<bool> visited(n,0);
            queue< int > q;
            q.push(s-1);
            visited[s-1] =1;
            out[s-1]=0;
    
            while(!q.empty()){
                int v = q.front(); q.pop();
    
                for(vector<int>::iterator it = g[v].begin(); it != g[v].end();it++){
                    if(visited[*it] == 0){
                        q.push(*it);
                        visited[*it] =1;
                        out[*it]=out[v]+6;
                    }
                }
    
            }
            for(int k =0; k<n; k++){
                if(k!= s-1){
                    cout << out[k] << " ";
                }
            }
            cout << endl;
        }
        return 0;
    }