题目描述
一个含n个结点的无向图,以矩阵存储方式给出,请求出指定的两个点之间的最短距离。
输入格式:
第一行,一个整数n(0 < n < 1000 ),表示无向图中结点的个数。
接下来是一个n*n的矩阵,表示无向图中各结点之间的联结情况,矩阵中的数值为小于等于1000的下整数,其中 0 表示两点之间无直接连接。
最后一行,两个整数i,j。表示求解i点到j点的最短距离。
输出格式:
一个数值,表示指定的两点之间最短距离。
输入样例#1:
2
0 2
2 0
1 2
输出样例#1:
2
【解题分析】
这是比较直白的一个单源点最短路问题,使用dijkstra算法,给每个节点设置标号,dis[i]表示从源点到第i个点的最短路的值,每次从还没标记的点里面找一个最小的dis值,将它标记掉(即确认该点的dis为它最短路),然后将这个点的所有有关联的点的dis进行更新,直到全部点处理完成。过程有点像贪心,每次取最小dis的值,但是需要不断的利用最新确定的点的dis值去更新其他点的dis值,对于所有边都是大于0的情况,这是必然可行的,这个更新的过程本质上是个DP的过程。
如果边权有负数呢?这个正确性就无法保证了,所以dijkstra算法只对正权边图有效。
进一步的,改算法的过程具有贪心性,每次取最小的dis,我们可以使用优先队列(二叉堆)对它 进行优化,提高它的运行效率。
【参考代码】
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
typedef pair<int,int> PP;
const int nn=10005;
struc

本文介绍了如何使用Dijkstra算法解决无向图中两点间的最短路径问题。通过举例说明输入和输出格式,并分析了算法的原理和适用条件,指出Dijkstra算法仅适用于边权为正数的图。还提到了使用优先队列优化算法效率的可能性。
&spm=1001.2101.3001.5002&articleId=128799571&d=1&t=3&u=e015e95a19a44a33baa1f2911a022735)
2015

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



