classSolution { public: intnumBusesToDestination(vector<vector<int>>& routes, int S, int T){ if (S == T) return0; int n = routes.size(); for (int i = 0; i < n; ++i) { sort(routes[i].begin(), routes[i].end()); routes[i].erase(unique(routes[i].begin(), routes[i].end()), routes[i].end()); } routes.push_back({S}); routes.push_back({T}); vector<vector<int>> G = buildGraph(routes, S, T); returnBFS(G); }
vector<vector<int>> buildGraph(vector<vector<int>>& routes, int S, int T) { int n = routes.size(); vector<vector<int>> G(n); for (int i = 0; i < n; ++i) { for (int j = i+1; j < n; ++j) { int su = routes[i].size(), sv = routes[j].size(); int u = 0, v = 0; while (u < su && v < sv) { if (routes[i][u] < routes[j][v]) ++u; elseif (routes[i][u] > routes[j][v]) ++v; else { G[i].push_back(j); G[j].push_back(i); break; } } } } return G; }
intBFS(vector<vector<int>>& G){ int n = G.size(); int S = n - 2; int T = n - 1; vector<int> dis(n, -1); queue<int> Q; Q.push(S); dis[S] = 0; while (!Q.empty()) { int u = Q.front(); Q.pop(); for (int i = 0, sz = G[u].size(); i < sz; ++i) { int v = G[u][i]; if (dis[v] == -1) { Q.push(v); dis[v] = dis[u] + 1; if (v == T) return dis[v]-1; } } } return-1; } };