=====DFS 基础=====
=====BFS 基础=====
Leetcode 815. 公交路线
思路:
class Solution { public: int numBusesToDestination(vector<vector<int>>& routes, int source, int target) { // 记录经过车站x的公交车编号 hash unordered_map<int, vector<int>> stop_to_buses; for (int i = 0; i < routes.size(); i ++) for (int x : routes[i]) stop_to_buses[x].push_back(i); //小优化:如果没有公交车经过起点or终点,直接返回 if (!stop_to_buses.contains(source) || !stop_to_buses.contains(target)) return source != target ? -1: 0; // 小心原地tp。。。 // BFS unordered_map<int, int> dis; dis[source] = 0; // 起点到自己肯定为0 queue<int> q; q.push(source); // 放入起点 while (!q.empty()){ int x = q.front(); // 当前在车站x q.pop(); int dis_x = dis[x]; for (int i : stop_to_buses[x]){ // 遍历所有经过车站x的公交车i for (int y: routes[i]) // 遍历公交车i的路线 if (!dis.contains(y)){ // 没访问过车站y时, 才可以从x到y站下车 dis[y] = dis_x + 1; // 距离实际上就是乘坐公交车的数量(乘坐多远倒无所谓) q.push(y); } routes[i].clear(); // 标记routes[i]遍历过(这个公交车路线被遍历过了) } } return dis.contains(target)? dis[target]: -1; } };
=====拓扑排序=====
=====在拓扑序上 DP=====
=====基环树=====
=====单源最短路:Dijkstra=====
=====全源最短路:Floyd=====
=====最小生成树:Kruskal/Prim=====
=====欧拉路径/欧拉回路:Hierholzer=====
=====强连通分量/双连通分量:Tarjan=====
=====二分图(染色判定、最大匹配)=====
=====网络流=====
=====其他=====