Dijk无优化模板

Dijk无优化模板

备注

复试使用,未优化,大概率过不了OJ。

描述

某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。

现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。

输入

本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。

输出

对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.

样例输入

3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2

样例输出

2
-1

code

#include <iostream>
using namespace std;

const int INF=99999;
const int M=10;

struct Graph{
   
    int vexnum;
    int arc[M][M];
}graph;

int min(int dist[],int set[],int n){
   
    int minVal=INF;
    int minIndex=-1
### 带权邻接矩阵在Dijkstra算法中的实现 #### 邻接矩阵表示方法 为了有效地处理加权图,通常采用邻接矩阵来表示图。对于一个具有`n`个节点的图而言,其邻接矩阵是一个大小为`n×n`的二维数组,在该数组中,如果存在一条从节点i到j权重为w(i,j)的边,则设置matrix[i][j]=w(i,j),否则设为无穷大(即不可达状态),这可以通过宏定义`INT_MAX`来表示[^1]。 ```cpp #include <climits> #define INF INT_MAX typedef double MAT[MaxSize][MaxSize]; ``` #### 初始化操作 初始化阶段需设定源点至自身的距离为0,并将其余所有顶点的距离初始化为无穷大;同时创建一个布尔型访问标记数组visited[]用于记录哪些顶点已被加入到了最短路径树中[^3]。 ```cpp void Init(MGraph G, int dist[], bool visited[]) { for (int i = 0; i < G.vexnum; ++i){ dist[i] = G.edges[source][i]; visited[i] = false; } visited[source] = true; } ``` #### 主循环逻辑 核心部分在于不断选取未被访问过的最近邻居作为新的起点更新其他可达结点之间的最短距离直到遍历完所有的顶点为止。每次迭代过程中都会选出尚未处理过且离已知集合最近的一个顶点u并把它纳入SPT(Shortest Path Tree)内,接着通过它尝试松弛那些由u可以直接抵达却还未收录进来的候选者v们所对应的估计值d[v]。 ```cpp for(int count=2;count<=G.vexnum;++count){ //除了起始点外还需要选V-1次 minDist = INF; u=-1; /* 寻找下一个要加入SPT集的顶点 */ for(v=0; v<G.vexnum ;++v) if(!visited[v] && dist[v]<minDist){ u=v; minDist=dist[v]; } visited[u]=true; /* 更新其它相邻顶点的距离 */ for(v=0;v<G.vexnum;++v) if(!visited[v] && G.edges[u][v]!=INF && dist[u]+G.edges[u][v]<dist[v]) dist[v]=dist[u]+G.edges[u][v]; } ``` 此过程重复执行直至所有顶点都被包含进来或者不存在更近的选择位置时结束整个流程。最终得到的结果就是从指定起点出发前往各个终点间的最优解向量表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值