Неправильное использование BFS - PullRequest
0 голосов
/ 19 июня 2020

Привет, я изучаю BFS, и я хотел использовать его, чтобы узнать расстояние от одной точки до другой, поэтому моя программа сканирует, например,

0 2 4
0 3 6
0 5 7
0 4 8
2 1 6
5 6 1
start, end, distance.

, и она должна сказать мне расстояние от 0 до 1 от 2 до 3 и т.д.

, поэтому в этом примере расстояние от 0 до 1 равно 10, потому что расстояние от 0 до 2 равно 4, а расстояние от 2 до 6.

но моя программа при компиляции говорит: terminate, вызываемый после создания экземпляра 'std :: bad_allo c' what (): std :: bad_allo c

Я хотел бы, чтобы вы помогли мне исправить это, поэтому работает Спасибо.

 #include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;
typedef vector<long long> vi;
typedef pair<long long,long long> pi;
typedef vector<pi> vpi;

#define FOR(i, a, b) for(ll i=ll(a); i<ll(b); i++)
#define ROF(i, a, b) for(ll i=ll(a); i>=ll(b); i--)
#define f first
#define s second
#define pb emplace_back
#define mp make_pair
#define SQ(a) (a)*(a)
#define all(a) (a).begin(), (a).end()

vector<pair<int,int> >adjacency_list[6];
bool visited[7];
int dist[7]={-1};
int main() {

dist[0]=0;
visited[0]=1;

for(int i=1;i<=6;i++){
  int a,b,c;
  cin>>a>>b>>c;
  adjacency_list[a].pb(mp(b,c));
    adjacency_list[b].pb(mp(a,c));
}

queue<int>q;

q.push(0);

while(!q.empty()){
  int current=q.front();
  q.pop();

for(auto i=adjacency_list[current].begin();i!=adjacency_list[current].end();i++){
if(!visited[i->first]){
  q.push(i->first);
  dist[i->first]=dist[current]+i->second;
  visited[i->first]= true;
  }
 }
}


for(int i=0;i<7;i++){
  cout<<i<<' '<<dist[i]<<endl;
}

 return 0;
}

1 Ответ

2 голосов
/ 19 июня 2020

adjacency_list имеет 6 элементов, но b в adjacency_list[b] может быть до 6, поэтому ваша программа имеет неопределенное поведение.

Я нашел это, заменив все ненужные typedef s, #define s и нестандартные #incldue s из вашего кода, заменяя необработанные массивы на std::array, а затем заменяя [] на at, который обнаружит доступ за пределами границ:

#include <vector>
#include <utility>
#include <iostream>
#include <queue>
#include <array>

std::array<std::vector<std::pair<int, int> >, 6> adjacency_list;
std::array<bool, 7> visited;
std::array<int, 7> dist = { -1 };
int main() {

    dist.at(0) = 0;
    visited.at(0) = 1;

    for (int i = 1; i <= 6; i++) {
        int a, b, c;
        std::cin >> a >> b >> c;
        adjacency_list.at(a).emplace_back(b, c);
        adjacency_list.at(b).emplace_back(a, c);
    }

    std::queue<int>q;

    q.push(0);

    while (!q.empty()) {
        int current = q.front();
        q.pop();

        for (auto i = adjacency_list.at(current).begin(); i != adjacency_list.at(current).end(); i++) {
            if (!visited.at(i->first)) {
                q.push(i->first);
                dist.at(i->first) = dist.at(current) + i->second;
                visited.at(i->first) = true;
            }
        }
    }

    for (int i = 0; i < 7; i++) {
        std::cout << i << ' ' << dist.at(i) << "\n";
    }

    return 0;
}
...