抄的题解:知道思路,但细节上不会处理
难点
dijksta
- open,closed数组如何表示
- 如何查找该节点的邻近节点
#include <vector> class Solution { public: int dijkstra(vector<vector<int>>& w, int n) { vector<bool> visited(n + 1, false); vector<int> dis(n + 1, INT_MAX); dis[1] = 0; for (int i = 1; i <= n; i++) { int temp = -1; for (int j = 1; j <= n; j++) { if (!visited[j] && (temp == -1 || dis[j] < dis[temp])) { temp = j; } } visited[temp] = true; for (int j = 1; j <= n; j++) { if (w[temp][j] != INT_MAX && dis[temp] != INT_MAX) { dis[j] = min(dis[j], dis[temp] + w[temp][j]); } } } return dis[n]; } /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 顶点数 * @param m int整型 边数 * @param graph int整型vector<vector<>> 一维3个数据,表示顶点到另外一个顶点的边长度是多少 * @return int整型 */ int findShortestPath(int n, int m, vector<vector<int> >& graph) { // write code here vector<vector<int>> w(n + 1, vector<int>(n + 1, INT_MAX)); for (int i = 0; i < n; i++) { w[i][i] = 0; } for (int i = 0; i < m; i++) { int vertex1 = graph[i][0]; int vertex2 = graph[i][1]; int weight = graph[i][2]; w[vertex1][vertex2] = min(weight, w[vertex1][vertex2]); } int res = dijkstra(w, n); return res == INT_MAX ? -1 : res; } };