簡體   English   中英

C ++ STL廣度優先搜索

[英]C++ STL 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);
} 

現在它甚至不適用於所有測試用例。 然后該程序被中止,來自黑客的錯誤消息是*解決方案中的錯誤:兩次釋放或損壞(輸出):0x00000000009e5cf0 *

我不知道為什么會這樣。 處理隊列時,為什么for循環中存在問題。

鏈接到hackerrank問題。

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

你需要

  1. 擺脫value ,這不是必需的。
  2. 那里的載體越界訪問就在那里。 什么是[-1]?
  3. 適當的縮進
  4. BFS總是按級別進行訪問。 您無需通過在隊列中推送負值來維護它。

正確的代碼是:

#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM