xdoj 网络时延

标题

网络时延

时间限制

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值