Dijkstra最简代码实现(无需结构体)
在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题。
在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用的一种,是一种按照路径长度递增的次序产生最短路径的算法。
接下来看程序:
输入格式
输入的第一行包含2个正整数n和s,表示图中共有n个顶点,且源点为s。
以后的n行中每行有n个用空格隔开的整数。对于第i行的第j个整数,如果大于0,则表示第i个顶点有指向第j个顶点的有向边,且权值为对应的整数值;如果这个整数为0,则表示没有i指向j的有向边。当i和j相等的时候,保证对应的整数为0。
输出格式
只有一行,共有n-1个整数,表示源点至其它每一个顶点的最短路径长度。如果不存在从源点至相应顶点的路径,输出-1。
请注意行尾输出换行。
样例输入
4 1 0 3 0 1 0 0 4 0 2 0 0 0 0 0 1 0
样例输出
6 4 7
代码:
#include <bits/stdc++.h> #define x first #define y second using namespace std; typedef pair<int, int> PII ; const int N = 100010, M = 2 * N, INF = 0x3f3f3f3f; int n, m; int h[N], w[M], e[M], ne[M], idx = 0; int st[N]; int dist[N]; vector<int> delay[N]; void add(int a, int b, int c) { e[idx] = b; w[idx] = c; ne[idx] = h[a]; h[a] = idx++; } void dijkstra() { priority_queue<PII, vector<PII>, greater<PII>> heap; heap.push({0, m + 1}); memset(st, 0, sizeof st); memset(dist, INF, sizeof dist); while(heap.size()) { PII t = heap.top(); heap.pop(); int ver = t.y; if(st[ver]) continue; st[ver] = 1; for(int i = h[ver]; i != -1; i = ne[i]) { int distance = t.x + w[i]; int j = e[i]; if(distance < dist[j]) { dist[j] = distance; heap.push({dist[j], j}); } } } } int main() { memset(h, -1, sizeof h); cin >> n >> m; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++){ int x; cin >> x; if(!x) continue; add(i, j, x); } } dijkstra(); for(int i = 1; i <= n; i++){ if(i == m + 1) continue; if(dist[i] == INF) cout << -1 << endl; else cout << dist[i] << " "; } return 0; }