思路
- 如何建图?——每辆公交为点,到每个车站的距离
- 如何扩展?——初始车站,有多少辆公交,公交所达的车站即可达
- 如何获取答案?——到达目标车站的公交,与初始车站的距离 的最小值
代码
步骤:
1. 特殊情况处理——起始与终点相等
2. 优化建图 以每辆公交到车站是否可达 同时统计车站公交线路
3. 将原始车站拥有的公交压入队列 进行扩展
4. 对目标车站的公交进行遍历 查找最小值
class Solution {
public:
int numBusesToDestination(vector<vector<int>>& routes, int source, int target) {
if (source == target)
return 0;
int n = routes.size();
vector<vector<int>> edge(n, vector<int>(n));
unordered_map<int, vector<int>> rec;
for (int i = 0; i < n; i++) {
for (int site : routes[i]) {
for (int j : rec[site]) {
edge[i][j] = edge[j][i] = true;
}
rec[site].push_back(i);
}
}
vector<int> dis(n, -1);
queue<int> que;
for (int bus : rec[source]) {
dis[bus] = 1;
que.push(bus);
}
while (!que.empty()) {
int x = que.front();que.pop();
for (int y = 0; y < n; y++) {
if (edge[x][y] && dis[y] == -1) {
dis[y] = dis[x] + 1;
que.push(y);
}
}
}
int ret = INT_MAX;
for (int bus : rec[target])
if (dis[bus] != -1)
ret = min(ret, dis[bus]);
return ret == INT_MAX ? -1 : ret;
}
};