1.Dijkstra算法
1.1 Dijkstra算法思想
- 设置两个顶点集S和T,集合S中存放已经找到最短路径的顶点,集合T中存放着当前还未找到最短路径的顶点;
- 初始状态下,集合S中只包含源点V1,T中为除了源点之外的其余顶点,此时源点到各顶点的最短路径为两个顶点所连的边上的权值,如果源点V1到该顶点没有边,则最小路径为无穷大;
- 从集合T中选取到源点V1的路径长度最短的顶点Vi加入到集合S中;
- 修改源点V1到集合T中剩余顶点Vj的最短路径长度。新的最短路径长度值为Vj原来的最短路径长度值与顶点Vi的最短路径长度加上Vi到Vj的路径长度值中的较小者;
- 不断重复步骤3、4,直至集合T的顶点全部加入到集合S中。
1.2 Dijkstra参考代码
#include<bits/stdc++.h>
const int MAX=1000000;
using namespace std;
int main()
{
int n,m;
int x,y,w;
int u=1;
cin>>n>>m;
vector<int> dis(n+1,MAX);
vector<int> vis(n+1,0);
vector<vector<pair<int,int>>> vec(n+1);
for(int i=0;i<m;i++<