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

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

vector<int> G[30];
bool g[30];

int d[30][30];
const int INF = 1e5;

/*bool dfs(int now, int pre){
        if(g[now] == true) return false;
        bool res = true;
        //cout << now << endl;
        g[now] = true;
        set<int> st;
        for(int i = 0; i < G[now].size(); i++){
                int next = G[now][i];
                //if(next == pre) continue;
                if(st.count(next)) continue;
                st.insert(next);
                res &= dfs(next, now);
        }
        return res;
}*/

void wf() {
  for (int k = 0; k < 26; k++) {
    for (int i = 0; i < 26; i++) {
      for (int j = 0; j < 26; j++) {
        d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
      }
    }
  }
  return;
}

int main() {
  int n;
  while (1) {
    for (int i = 0; i < 26; i++) {
      G[i].clear();
      for (int j = 0; j < 26; j++)
        d[i][j] = INF;
      d[i][i] = 0;
    }
    cin >> n;
    if (n == 0)
      break;
    vector<string> s(n);
    for (int i = 0; i < n; i++) {
      cin >> s[i];
    }
    bool f = true;
    for (int i = 0; i < n - 1; i++) {
      for (int j = 0; j < s[i].size(); j++) {
        if (s[i + 1].size() == j) {
          f = false;
          break;
        }
        if (s[i][j] != s[i + 1][j]) {
          G[s[i][j] - 'a'].push_back(s[i + 1][j] - 'a');
          // cout << s[i][j] << "->" << s[i + 1][j] << endl;
          break;
        }
      }
    }
    for (int i = 0; i < 26; i++) {
      for (int j = 0; j < G[i].size(); j++) {
        d[i][G[i][j]] = -1;
      }
    }
    wf();
    // int e[26][26] = {};
    // for(int i = 0; i < 26; i++) for(int j = 0; j < 26; j++) e[i][j] =
    // d[i][j]; wf();
    for (int i = 0; i < 26; i++) {
      // cout << d[i][i] << endl;
      if (d[i][i] != 0)
        f = false;
      // for(int j = 0; j < 26; j++){
      //	if(d[i][j] != e[i][j]) f = false;
      // }
    }
    /*for(int j = 0; j < 26; j++){
    //cout << j << " " << f << endl;
            for(int i = 0; i < 26; i++) g[i] = false;
            f &=  dfs(j, -1);
    }*/
    if (f)
      cout << "yes" << endl;
    else
      cout << "no" << endl;
  }
}

Error: 0

Fixed submission:

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

vector<int> G[26];
bool g[26];

int d[26][26];
const int INF = 1e5;

bool dfs(int now, int pre) {
  if (g[now] == true)
    return false;
  bool res = true;
  // cout << now << endl;
  g[now] = true;
  set<int> st;
  for (int i = 0; i < G[now].size(); i++) {
    int next = G[now][i];
    // if(next == pre) continue;
    if (st.count(next))
      continue;
    st.insert(next);
    res &= dfs(next, now);
  }
  return res;
}

int n;

void wf() {
  for (int k = 0; k < n; k++) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
      }
    }
  }
}

int main() {
  while (1) {
    for (int i = 0; i < 26; i++) {
      G[i].clear();
      for (int j = 0; j < 26; j++)
        d[i][j] = INF;
      d[i][i] = 0;
    }
    cin >> n;
    if (n == 0)
      break;
    vector<string> s(n);
    for (int i = 0; i < n; i++) {
      cin >> s[i];
    }
    bool f = true;
    for (int i = 0; i < n - 1; i++) {
      for (int j = 0; j < s[i].size(); j++) {
        if (s[i + 1].size() == j) {
          f = false;
          break;
        }
        if (s[i][j] != s[i + 1][j]) {
          G[s[i][j] - 'a'].push_back(s[i + 1][j] - 'a');
          // cout << s[i][j] << "->" << s[i + 1][j] << endl;
          break;
        }
      }
    }
    for (int i = 0; i < 26; i++) {
      for (int j = 0; j < G[i].size(); j++) {
        d[i][G[i][j]] = -1;
      }
    }
    wf();
    // int e[26][26] = {};
    // for(int i = 0; i < 26; i++) for(int j = 0; j < 26; j++) e[i][j] =
    // d[i][j]; wf();
    for (int i = 0; i < 26; i++) {
      // cout << d[i][i] << endl;
      if (d[i][i] != 0)
        f = false;
      // for(int j = 0; j < 26; j++){
      //	if(d[i][j] != e[i][j]) f = false;
      // }
    }
    /*for(int j = 0; j < 26; j++){
    //cout << j << " " << f << endl;
            for(int i = 0; i < 26; i++) g[i] = false;
            f &=  dfs(j, -1);
    }*/
    if (f)
      cout << "yes" << endl;
    else
      cout << "no" << endl;
  }
}