1.问题适用情景
求一个顶点到其余各个顶点最短路径的长度。
边的集合中不能有负权边(不能有权值为负数的边)。
2.操作
在顶点集合S中选出距离起点最近的顶点t。
利用顶点t更新与t相邻节点的距离。
顶点t移出集合S。
重复上述步骤直到所有点移出集合S。
3.栗子
王卓老师课程9分种开始
4.练习
5.代码
朴素版
#include<iostream>
#include<cstring>
using namespace std;
const int N=510;
int n,m; // n个结点,m条边
int g[N][N]; // 存储图的邻接矩阵
int dist[N]; // 从起点到编号为i的结点的距离dist[i]
bool st[N]; // 标记编号为i的结点是否在集合内
int dijkstra(int start)
{
memset(dist,0x3f,sizeof dist);
dist[start]=0; // 起点到起点的距离为0
for(int i=0;i<n;i++) // 操作n次,每次从集合移出一个节点
{
int t=-1;
for(int j=1;j<=n;j++) // 从1到n中寻找距离起点最近的节点
if(!st[j]&&(t==-1||dist[j]<dist[t])) t=j; // 该节点在集合中,并且是集合中距离起点最近的点
for(int j=1;j<=n;j++)
dist[j]=min(dist[j],dist[t]+g[t][j]); // 利用节点t更新相邻节点的最短距离
st[t]=true; // 标记该节点,移出集合
}
if(dist[n]==0x3f3f3f3f)return -1;
return dist[n];
}
int main()
{
scanf("%d%d",&n,&m);
memset(g,0x3f,sizeof g); // g数组初始化为无穷大