机考题二
• 40 分, LeetCode medium 档次
• 从控制台输入n+1 行,前n 行每行3 个整数,形如“A B d”,表示从节点A 到节点B 距离为d(双向)。第n+1 行形如“A B”,表示求A 到B 的最短距离。输出此最短距离。
• 例如:
1 42 3
42 789 4
1 789 9
1 789
输出
7
• BFS、动态规划、剪枝、图
--------------------------------------------------------------------------------
思路
没有看懂南大同学提示里写的“BFS、动态规划、剪枝”是什么意思,也看到一篇博文说是用0-1规划做的,不是很懂(求教)?
我的做法是首先把输入的节点的编号存到一个数组vset中,再将vset排序,然后排好序的vset去重得到n个不重复的节点,重新映射到编号0~n-1,然后再用标准的Dijkstra解一个最短路问题。
记图的节点个数为n,边条数为m(记号与题面中不一样),节点重编号复杂度O(mlogm),Dijkstra复杂度为O(n^2),如果认为m~n^2的话,总的复杂度就是O(mlogm) = O(mlogn)。
--------------------------------------------------------------------------------
代码
#include<cstdio>
#include<map>
#include<algorithm>
const int MMAX = 10005, NMAX = 105, INF = 0x3f3f3f3f;
int v1[MMAX] = {}, v2[MMAX] = {}, L[MMAX] = {};
int vset[MMAX] = {};
int d[NMAX] =

这篇博客主要介绍了如何解答清华大学软件学院保研机试中的第二道题目,该题要求求解从给定节点A到节点B的最短路径。博主采用Dijkstra算法来解决,先对输入节点进行排序和去重,然后重新映射节点编号,最后应用Dijkstra算法。虽然没理解其他解法,但博主的解决方案的时间复杂度在最坏情况下为O(mlogn)。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



