标题
网络时延
时间限制
1 S
内存限制
1000 Kb
问题描述
有N个网络节点,标记为1到N。
给定一个二维数组times[M][3],表示信号经过有向边的传递时间。times[i][3] = {u, v, w}, 其中u是源节点,v是目标节点,w是一个信号从源节点传递到目标节点的时间,即二维数组中的一行表示一条带权有向边。
现在,我们向当前的节点K 发送一个信号。最少需要多长时间才能使所有节点都收到信号?如果不能使所有节点收到信号,返回-1。
注意:
M的范围在[1,50]之间
N的范围在[1, 20] 之间。
K的范围在[1, N] 之间。
所有的边times[i][3] =(u, v, w)都有1 <= u, v <= N 且 1 <= w <= 50。
问题输入
多行输入数据,第1行为3个正整数,分别是M,N,K。接下来有M行,每行有3个正整数,分别是u, v, w。
问题输出
输出一个数,表示需要多久才能使所有节点都收到信号。如果不能使所有节点收到信号,返回-1
输入样例
3 4 2
2 1 1
2 3 1
3 4 1
输出样例
2
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int m, n, a;
int i, j, k;
int arcs[50][50];
int max = 0;
int flag = 1;
scanf("%d %d %d", &m, &n, &a);
for (i = 1; i <= n; i++)//邻接矩阵初始化
{
for (j = 1; j <= n; j++)
{
if (i == j)
arcs[i][j] = 0;//对角线初始化为零,方便后续查找不可达的情况
else
arcs[i][j] = 32767;//int类型的最大值
}
}
for (i = 0; i < m; i++)//输入邻接矩阵(有向图)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
arcs[u][v] = w;
}
for (k = 1; k <= n; k++)//fff
{
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
if (arcs[i][j] > arcs[i][k] + arcs[k][j])
{
arcs[i][j] = arcs[i][k] + arcs[k][j];
}
}
}
}
for (i = 1; i <= n; i++)
{
if (arcs[a][i] != 32767)//可达
{
if (arcs[a][i] > max)
max = arcs[a][i];
}
else//存在不可达情况
{
flag = 0;
break;
}
}
if (flag == 1)
printf("%d", max);
else
printf("-1");
return 0;
}