Dijkstra求最短路 (朴素版本)边权为正
题目:https://www.acwing.com/problem/content/851/
Dijstra朴素版求单源最短路问题:
1、适用情况:适用于稠密图(边数远大于点数)
2、算法分析:
- Dijstra算法的核心就是先假设所有的点到起点的距离为无穷大,然后通过枚举每一个点到起点的距离,找到其中距离起点距离最短的那个点,通过该点来更新剩下没有选中的点到起点的距离,然后在通过枚举剩下的点到该点的距离,取其中最小的,重复上述更新距离的操作即可。
- 在了解的算法思路后,一定要牢记模板,加深理解。
3、题解:
#include#include #include using namespace std; const int N = 510; int g[N][N], dis[N]; bool judge[N]; int n, m; int dijstra() { memset(dis, 0x3f, sizeof dis); dis[1] = 0; for(int i = 1; i < n; i++) // n次迭代(就是找n次距离最短的点) { int t = -1; // t=-1的目的是为了在剩下没有更新的点中找到第一个点更方便。 for(int j = 1; j <= n; j++) if(!judge[j] && (t == -1 || dis[t] > dis[j])) // 如果没有t的话 找到第一个更新的点就会比较麻烦 t = j; for(int j = 1; j <= n; j++) dis[j] = min(dis[j], dis[t] + g[t][j]); // 更新距离 judge[t] = true; // 并入集合 } if(dis[n] == 0x3f3f3f3f) return -1; return dis[n]; } int main() { cin >> n >> m; memset(g, 0x3f, sizeof g); while(m--) { int a, b, c; cin >> a >> b >> c; g[a][b] = min(g[a][b], c); // 防止重边和自环,但自环在朴素版dijstra中没有什么影响 } cout << dijstra() << endl; return 0; }