Problem p00155 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
using namespace std;
int main() {
  int n;
  while (cin >> n, n) {
    double g[n][n];
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
        g[i][j] = 100000000;
    int b[n], x[n], y[n];
    for (int i = 0; i < n; i++) {
      int b, _x, _y;
      cin >> b >> _x >> _y;
      x[b - 1] = _x;
      y[b - 1] = _y;
      // cin >> b[i] >> x[i] >> y[i];
    }
    for (int i = 0; i < n; i++)
      for (int j = i + 1; j < n; j++) {
        int xx = x[i] - x[j], yy = y[i] - y[j];
        if (pow(xx, 2) + pow(yy, 2) <= 2500 && i != j)
          g[i][j] = g[j][i] = sqrt(pow(xx, 2) + pow(yy, 2));
      }
    int m;
    cin >> m;
    int s, go;
    for (int i = 0; i < m; i++) {
      cin >> s >> go;
      s--;
      go--;
      vector<int> used(n, false);
      vector<int> gone(n, false);
      vector<double> dist(n, 100000000);
      dist[s] = 0;
      gone[s] = 0;
      while (1) {
        int va = -1;
        for (int j = 0; j < n; j++)
          if (used[j] == false && (va == -1 || dist[va] > dist[j]))
            va = j;
        if (va == -1)
          break;
        used[va] = true;
        for (int j = 0; j < n; j++) {
          if (dist[j] >= dist[va] + g[va][j])
            gone[j] = va;
          dist[j] = min(dist[j], dist[va] + g[va][j]);
        }
      }
      if (s == go)
        cout << s + 1 << " " << go + 1 << endl;
      else if (dist[go] == 100000000)
        cout << "NA" << endl;
      else {
        int kari = go;
        stack<int> out;
        while (1) {
          out.push(gone[kari] + 1);
          kari = gone[kari];
          if (kari == s)
            break;
        }
        while (!out.empty()) {
          cout << out.top() << " ";
          out.pop();
        }
        cout << go + 1 << endl;
      }
    }
  }
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
int main() {
  int n;
  while (cin >> n, n) {
    double g[n][n];
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
        g[i][j] = 100000000;
    int b[n], x[n], y[n];
    for (int i = 0; i < n; i++) {
      int b, _x, _y;
      cin >> b >> _x >> _y;
      x[b - 1] = _x;
      x[b - 1] = _y;
      // cin >> b[i] >> x[i] >> y[i];
    }
    for (int i = 0; i < n; i++)
      for (int j = i + 1; j < n; j++) {
        int xx = x[i] - x[j], yy = y[i] - y[j];
        if (pow(xx, 2) + pow(yy, 2) <= 2500 && i != j)
          g[i][j] = g[j][i] = sqrt(pow(xx, 2) + pow(yy, 2));
      }
    int m;
    cin >> m;
    int s, go;
    for (int i = 0; i < m; i++) {
      cin >> s >> go;
      s--;
      go--;
      vector<int> used(n, false);
      vector<int> gone(n, false);
      vector<double> dist(n, 100000000);
      dist[s] = 0;
      gone[s] = 0;
      while (1) {
        int va = -1;
        for (int j = 0; j < n; j++)
          if (used[j] == false && (va == -1 || dist[va] > dist[j]))
            va = j;
        if (va == -1)
          break;
        used[va] = true;
        for (int j = 0; j < n; j++) {
          if (dist[j] >= dist[va] + g[va][j])
            gone[j] = va;
          dist[j] = min(dist[j], dist[va] + g[va][j]);
        }
      }
      if (s == go)
        cout << s + 1 << " " << go + 1 << endl;
      else if (dist[go] == 100000000)
        cout << "NA" << endl;
      else {
        int kari = go;
        stack<int> out;
        while (1) {
          out.push(gone[kari] + 1);
          kari = gone[kari];
          if (kari == s)
            break;
        }
        while (!out.empty()) {
          cout << out.top() << " ";
          out.pop();
        }
        cout << go + 1 << endl;
      }
    }
  }
}