原理及思路
基础版
- 利用广度优先搜索BFS, 遍历整个图
- 使用两个集合, vis 负责顶点访问标志, dis 负责实时更新顶点
- 开始时 dis 只有源顶点, 且源顶点到每个顶点的距离为无穷大(infinity), 接着把所有与目前顶点连通的顶点, 纳入到dis中, 更新到新顶点的最短距离, 更新 vis 访问标志
- 重复第二个动作, 直到所有顶点纳入到 dis 中
优化版
- 背景: 基础版由于双层循环, 时间复杂度达到O(n^2), 当 n 过大时, 时间会爆掉
- 原理和思路:
- 利用vector创建邻接表, 替换二维数组, 节省空间
- 把最短路径排序更新, 使用C++自带STL——priority_queue 优先队列, 来保存新加入顶点的权值, 完成自动排序, 减少运行时间
实现
测试数据
4 5
1 2 3
1 3 5
1 4 7
2 4 2
3 4 1
基础无优化版
#include<iostream>
#include<cstring>
using namespace std;
const int INF = 10000;
int edge[50][50];
int dis[50];
bool vis[50];
int n, m;
int main()
{
freopen("in.txt", "r", stdin);
scanf("%d%d", &n, &m);
int min;
int x, y, d;
memset(edge, INF, sizeof(edge));
memset(dis, INF, sizeof(dis));
memset(vis, false, sizeof(vis));
for(int i = 0; i < m;i++) {
scanf("%d%d%d", &x, &y, &d);
edge