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
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | <code-pre class = "code-pre" id= "pre-TFPXcd" ><code-line class = "line-numbers-rows" ></code-line>#include <bits/stdc++.h> <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line>#define x first <code-line class = "line-numbers-rows" ></code-line>#define y second <code-line class = "line-numbers-rows" ></code-line> using namespace std; <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> typedef pair< int , int > PII ; <code-line class = "line-numbers-rows" ></code-line> const int N = 100010, M = 2 * N, INF = 0x3f3f3f3f; <code-line class = "line-numbers-rows" ></code-line> int n, m; <code-line class = "line-numbers-rows" ></code-line> int h[N], w[M], e[M], ne[M], idx = 0; <code-line class = "line-numbers-rows" ></code-line> int st[N]; <code-line class = "line-numbers-rows" ></code-line> int dist[N]; <code-line class = "line-numbers-rows" ></code-line>vector< int > delay[N]; <code-line class = "line-numbers-rows" ></code-line> void add( int a, int b, int c) { <code-line class = "line-numbers-rows" ></code-line> e[idx] = b; <code-line class = "line-numbers-rows" ></code-line> w[idx] = c; <code-line class = "line-numbers-rows" ></code-line> ne[idx] = h[a]; <code-line class = "line-numbers-rows" ></code-line> h[a] = idx++; <code-line class = "line-numbers-rows" ></code-line>} <code-line class = "line-numbers-rows" ></code-line> void dijkstra() { <code-line class = "line-numbers-rows" ></code-line> priority_queue<PII, vector<PII>, greater<PII>> heap; <code-line class = "line-numbers-rows" ></code-line> heap.push({0, m + 1}); <code-line class = "line-numbers-rows" ></code-line> memset (st, 0, sizeof st); <code-line class = "line-numbers-rows" ></code-line> memset (dist, INF, sizeof dist); <code-line class = "line-numbers-rows" ></code-line> while (heap.size()) { <code-line class = "line-numbers-rows" ></code-line> PII t = heap.top(); <code-line class = "line-numbers-rows" ></code-line> heap.pop(); <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> int ver = t.y; <code-line class = "line-numbers-rows" ></code-line> if (st[ver]) continue ; <code-line class = "line-numbers-rows" ></code-line> st[ver] = 1; <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> for ( int i = h[ver]; i != -1; i = ne[i]) { <code-line class = "line-numbers-rows" ></code-line> int distance = t.x + w[i]; <code-line class = "line-numbers-rows" ></code-line> int j = e[i]; <code-line class = "line-numbers-rows" ></code-line> if (distance < dist[j]) { <code-line class = "line-numbers-rows" ></code-line> dist[j] = distance; <code-line class = "line-numbers-rows" ></code-line> heap.push({dist[j], j}); <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line>} <code-line class = "line-numbers-rows" ></code-line> int main() { <code-line class = "line-numbers-rows" ></code-line> memset (h, -1, sizeof h); <code-line class = "line-numbers-rows" ></code-line> cin >> n >> m; <code-line class = "line-numbers-rows" ></code-line> for ( int i = 1; i <= n; i++) { <code-line class = "line-numbers-rows" ></code-line> for ( int j = 1; j <= n; j++){ <code-line class = "line-numbers-rows" ></code-line> int x; <code-line class = "line-numbers-rows" ></code-line> cin >> x; <code-line class = "line-numbers-rows" ></code-line> if (!x) continue ; <code-line class = "line-numbers-rows" ></code-line> add(i, j, x); <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> dijkstra(); <code-line class = "line-numbers-rows" ></code-line> for ( int i = 1; i <= n; i++){ <code-line class = "line-numbers-rows" ></code-line> if (i == m + 1) continue ; <code-line class = "line-numbers-rows" ></code-line> if (dist[i] == INF) cout << -1 << endl; <code-line class = "line-numbers-rows" ></code-line> else cout << dist[i] << " " ; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> return 0; <code-line class = "line-numbers-rows" ></code-line>} </code-pre> |
__EOF__

本文作者:从荣
本文链接:https://www.cnblogs.com/rongrongrong/p/17252933.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/rongrongrong/p/17252933.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具