抄的题解:知道思路,但细节上不会处理
难点
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;
}
};

京公网安备 11010502036488号