这是在openjudge百练上看到的一道练习题,我看到通过率有点儿低,以为会有点儿难度。实际上是个送分题。
题目
描述
有N(不大于10)座城市,编号为1至N,已知任意两个城市间直接距离(不超过1000的非负整数)。求距离(直接或间接)城市1不超过K(K为小于100的正整数)的所有城市中编号最大的是哪座。
输入
第一行输入一个整数n
第二行输入一个整数K
之后n行,每行n个整数,描述了城市间距离的邻接矩阵,其中第i行第j个表示城市i到城市j的距离。相邻整数用空格分开。
输出
距离不超过K的城市的最大编号
样例
Input:
3
3
0 1 4
1 0 3
4 3 0
Output:
2
分析
经典的非负权有向图的有源最短路,使用Dijkstra算法求解。
简单地说,Dijkstra算法,就是:
- 将所有的节点分为两组,一组是已知最短路的(记为A),一组是未知最短路的(记为B)。最初所有节点都在B中。
- 记录一个距离数组D[N],表示从源src到其它所有点的“已计算的最短距离”。如果一个点 i 在组A中,那么D[i]就表示了最短路的距离。如果点 i 在组B当中,D[i]表示的距离是待计算优化的。
- 初始化时,D[源] = 0,D[其它节点]=无穷大
- 循环:每次从B组找到一个 i ∈ B m i n i m i z e D [ i ] i \in B\ minimize\ D[i] i∈B minimize D[i],将 i i i放到A组去。并对所有和 i i i有邻接的节点 j j j,令 D [ j ] ← m