Leetcode题解系列——Network Delay Time(c++版)

版权声明: https://blog.csdn.net/dickdick111/article/details/82956924

题目链接:743.Network Delay Time

题目大意:给出一个有向带权图,从一个结点传播信息,需要多久时间使到所有结点都收到该信息。即找到一条从该结点到所有结点的一条最长的路径权重

注意点:

  1. 题目给出的数据结构是边的集合,遍历的时候只能全部遍历一次。
  2. 图可能无法找到一条通过所有结点的路径,因此要输出-1.
  3. 注意将访问过的结点给赋值visited数组为1,不应继续访问。

一.算法设计

这是一个有向带权图找最短路径的问题,应该使用Dijkstra算法来寻找最短路径的最大权重。Dijkstra算法的基本思路是,在一个距离的集合当中,先找到一条最短边,然后通过这条边来不断更新起点到其他点的最短距离,只需遍历完所有的边即可找到起点到达所有点的最短距离。

由于,这里是一个稠密图,故我使用数组的形式来演示更新过程。而对于稀疏图,我们可以用优先队列来更新。

首先,要将dist数组都赋值为最大值,visited数组都设置为未访问。
然后,将起点的距离设置为0,开始进行更新。
更新过程,我每次都从数组中找到未访问过的距离最小的结点,然后对于这个结点来看其他结点的距离是否可以减少,如果可以就更新dist数组。
更新结束后,要将visited数组设置为已访问。

二.实现过程

class Solution {
public:
    int dist[101] = {0};
    int networkDelayTime(vector<vector<int>>& times, int N, int K) {
        for(int i = 0; i < 101; i++){
            dist[i] = 10000;
        }
        dist[K] = 0;
        int u;
        int visited[101] = {0};
        int min_num = 10000;
        int min_index = K;
        for(int k = 1; k <= N; k++){
            for(int j = 1; j <= N; j++){
                if(!visited[j] && dist[j] < min_num){
                    min_num = dist[j];
                    min_index = j;
                }
            }
            u = min_index;
            if(!visited[u]){
                for(int i = 0; i < times.size(); i++){
                    if(times[i][0] == u){
                        if(dist[times[i][1]] > dist[u] + times[i][2]){
                            dist[times[i][1]] = dist[u] + times[i][2];
                        }
                    }
                }
            }
            visited[u] = 1;
            min_num = 10000;
        }
        int max_num = 0;
        for(int i = 1; i <= N; i++){
            //cout << dist[i] << endl;
            if(dist[i] > max_num){
                max_num = dist[i];
            }
        }
        return max_num == 10000? -1:max_num;
    }
    
};

猜你喜欢

转载自blog.csdn.net/dickdick111/article/details/82956924
今日推荐