Description
给出一个图的邻接矩阵,输入顶点v,用迪杰斯特拉算法求顶点v到其它顶点的最短路径。
代码模板:
#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
typedef pair<int, int> pii; // 预定义数据对,first为结点与起点距离,second为结点编号
const int maxn = 110;
int t, n;
int g[maxn][maxn]; // 图
int last[maxn]; // 最短路“上一个”结点
int dis[maxn]; // 结点与起点的动态更新的距离
char buf[20]; // 字符串输入缓存
int start; // 起点
void Dijkstra(int start)
{
// 此处 相对 “priority_queue<pii> q;” 的常规写法来说:
// “, vector<pii>, greater<pii> ” 用于让优先队列构建大顶堆,从而每次出队为最小值
priority_queue<pii, vector<pii>, greater<pii> > q;
// TODO: 初始化各结点与起点距离为无穷大(假设0x3f3f3f3f为无穷大)
// TODO: 初始化dis[start], 起点与起点的距离为0
// TODO: 起点放入优先级队列
// TODO: 记录路径,起点的“上一个”为空
while(!q.empty())
{
pii now = q.top(); // 优先级队列队顶用“top”而不用“front”
q.pop(); // 出队
// 如果出队结点记录的距离不是最新的距离,则丢弃该出队结点
if(now.first != dis[now.second]) continue;
for(int i = 0; i < n; i ++)
{
// TODO: 对每个与 now.second 相连接的结点,看是否能更新该结点与起点的距离
// 能更新则更新后将该结点入队
// 更新 last[i],i结点在最短路中的“上一个”
}
}
}
void Output(int start, map<int, string> &mpNode)
{
// TODO: 利用last信息输出路径
// dis 为无穷(0x3f3f3f3f)的结点表示未连通
}
int main()
{
for(scanf("%d",

ThisarticleexplainstheimplementationofDijkstrasalgorithmtofindshortestpathsfromagivenvertexusinganadjacencymatrix,focusingonpriorityqueueusageandpathtracing.Italsodiscussesdifferencesbetweentraditionalapproachandpriority-basedsolution.
最低0.47元/天 解锁文章
1314

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



