版权声明: https://blog.csdn.net/dickdick111/article/details/82956924
题目大意:给出一个有向带权图,从一个结点传播信息,需要多久时间使到所有结点都收到该信息。即找到一条从该结点到所有结点的一条最长的路径权重。
注意点:
- 题目给出的数据结构是边的集合,遍历的时候只能全部遍历一次。
- 图可能无法找到一条通过所有结点的路径,因此要输出-1.
- 注意将访问过的结点给赋值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;
}
};