一、题目描述
某通信网络中有N个网络节点,用1到N进行标识。
网络通过一个有向无环图表示,其中图的边的值表示结点之间的消息传递时延。
现给定相连节点之间的时延列表times[i] = {u,v,w}
,u表示源节点,v表示目的节点,w表示u和v之间的消息传递时延。
请计算给定源节点到目的节点的最小传输时延,如果目的节点不可达,返回-1。
二、输入描述
第一行输入两个正整数,表示网络节点的个数N,M,用空格分割;
下面的M行表示两个节点之间的时延列表{u,v,w}
;
最后一行输入两个正整数,u表示源节点,v表示目的节点;
三、输出描述
输出一个整数,表示源节点到目的节点的最小时延。
四、解题思路
- 定义一个时延列表{u,v,w}的集合list;
- 将M行输入的时延列表
{u,v,w}
加入list; - 递归调用,计算定源节点到目的节点,符合要求的时延集合;
- 计算给定源节点到目的节点的最小传输时延;
- 如果目的节点不可达,返回-1
五、Java算法源码
// 完成源节点到目的节点的时延集合
public static List<Integer> delayList = new ArrayList<>();
// 时延列表的集合
// 下面的M行表示两个节点之间的时延列表{u,v,w}
public static List<int[]> uvwList = new ArrayList<>();
/**
* 3 3
* 1 2 11
* 2 3 13
* 1 3 50
* 1 3
*
* 24
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 网络节点的个数
int N = sc.nextInt();
// 时延列表的长度
int M = sc.nextInt();
// 下面的M行表示两个节点之间的时延列表{u,v,w}
for (int j = 0; j < M; j++) {
// u表示源节点,v表示目的节点,w表示u和v之间的消息传递时延
int[] arr = new int[3];
// u表示源节点
arr[0] = sc.nextInt();
if (arr[0] < 1 || arr[0] > N) {
System.out.println("源节点输入值不合规");
break;
}
// v表示目的节点
arr[1] = sc.nextInt();
if (arr[1] < 1 || arr[1] > N) {
System.out.println("目的节点输入值不合规");
break;
}
// w表示u和v之间的消息传递时延
arr[2] = sc.nextInt();
uvwList.add(arr);
}
// 源节点
int begin = sc.nextInt();
// 目的节点
int end = sc.nextInt();
// 计算源节点到目的节点,符合要求的时延集合
getDelay(begin, end, 0);
// 如果目的节点不可达,返回-1
if (delayList.size() == 0) {
System.out.println(-1);
} else {
// 计算给定源节点到目的节点的最小传输时延
System.out.println(Collections.min(delayList));
}
}
/**
* 计算源节点到目的节点,符合要求的时延集合
*
* @param begin 源节点
* @param end 目的节点
* @param count 时延总数
*/
public static void getDelay(int begin, int end, int count) {
// 遍历时延列表的集合List<{u,v,w}>
for (int i = 0; i < uvwList.size(); i++) {
int[] temp = uvwList.get(i);
// 第一个节点 = 源节点
if (temp[0] == begin) {
// 如果动态源节点 = 目的节点,完成源节点到目的节点的网络传输
if (temp[1] == end) {
// 累加消息传递时延
delayList.add(count + temp[2]);
continue;
}
// 第二个节点 = 动态源节点,完成源节点到目的节点的网络传输
getDelay(temp[1], end, count + temp[2]);
}
}
}
六、效果展示
1、输入
5 4
1 3 10
3 4 5
4 5 12
1 5 25
1 5
2、输出
25
3、说明
计算源节点1到目的节点5,符合要求的时延集合
1到3时延10 + 3到4时延5 + 4到5时延12 = 27;
1到5时延25;
所以源节点1到目的节点5的最小时延是25。
🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。