题目描述
示例1
输入: routes = [[1, 2, 7], [3, 6, 7]]S = 1T = 6 输出: 2 解释: 最优策略是先乘坐第一辆公交车到达车站 7, 然后换乘第二辆公交车到车站 6。
提示
题解
代码
c++
classSolution { public: intnumBusesToDestination(vector<vector<int>>&routes, intS, intT) { if (S==T) return0; intn=routes.size(); for (inti=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, intS, intT) { intn=routes.size(); vector<vector<int>>G(n); for (inti=0; i<n; ++i) { for (intj=i+1; j<n; ++j) { intsu=routes[i].size(), sv=routes[j].size(); intu=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; } } } } returnG; } intBFS(vector<vector<int>>&G) { intn=G.size(); intS=n-2; intT=n-1; vector<int>dis(n, -1); queue<int>Q; Q.push(S); dis[S] =0; while (!Q.empty()) { intu=Q.front(); Q.pop(); for (inti=0, sz=G[u].size(); i<sz; ++i) { intv=G[u][i]; if (dis[v] ==-1) { Q.push(v); dis[v] =dis[u] +1; if (v==T) returndis[v]-1; } } } return-1; } };
作者简介:godweiyang,知乎同名,华东师范大学计算机系硕士在读,方向自然语言处理与深度学习。喜欢与人分享技术与知识,期待与你的进一步交流~