有 N
个网络节点,标记为 1
到 N
。
给定一个列表 times
,表示信号经过有向边的传递时间。 times[i] = (u, v, w)
,其中 u
是源节点,v
是目标节点, w
是一个信号从源节点传递到目标节点的时间。
现在,我们向当前的节点 K
发送了一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1
。
注意:
N
的范围在 [1, 100]
之间。K
的范围在 [1, N]
之间。times
的长度在 [1, 6000]
之间。times[i] = (u, v, w)
都有 1 <= u, v <= N
且 1 <= w <= 100
。图算法中,最短路径问题是比较经典的问题,用处也很广泛。本题是使用bellman-ford算法解决网络延迟的例子,bellman-ford算法相对于dijkstra算法更加简单,不过bf算法更加具有一般性,算法大概思路是不断更新距离,如果不存在变化,就完成了最短路径查找。
本题中先通过BF算法找出所有节点到K的距离,然后取得最大的距离。
流程图:
源代码:
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#define INT_MAX 2147483647
#define min(a, b) (a < b ? a : b)
#define max(a, b) (a > b ? a : b)
/*
N是网络节点数(1-N)
K是起始节点
返回值:
返回从K到所有节点的最短时间
*/
int networkDelayTime(int **times, int timesRowSize, int timesColSize, int N, int K)
{
int dist[N + 1];
for (int i = 0; i < N + 1; ++i)
{
//初始化K到每个节点的距离为最大值
dist[i] = INT_MAX;
}
//到自己的距离为0
dist[K] = 0;
int loop = 1;
while (loop--)
{
//遍历所有边
for (int i = 0; i < timesRowSize; i++)
{
//寻找变化的节点
if (dist[times[i][0]] != INT_MAX)
{
int u = dist[times[i][0]];
int v = dist[times[i][1]];
int w = times[i][2];
//更新较小路径
dist[times[i][1]] = min(u + w, v);
//存在更新
if (v != dist[times[i][1]])
loop = 1;
}
}
}
int max_num = 0;
//取得距离K节点最远的值
for (int i = 1; i <= N; i++)
{
if (dist[i] == INT_MAX)
return -1;
max_num = max(max_num, dist[i]);
}
return max_num;
}