题解 | #单源最短路#

单源最短路

https://www.nowcoder.com/practice/9f15b34a2a944a7798a5340ff0dba8b7

抄的题解:知道思路,但细节上不会处理

难点

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;

    }


};

全部评论

相关推荐

01-11 08:47
门头沟学院 Java
choumoduji...:读研的目的就是为了以最快的速度和最低的要求完成“学校”规定的毕业标准,而不是所谓课题组的要求
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务