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 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   荣荣荣荣荣荣  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示