P3371单源最短路径(弱化版)

一、题目描述

  

 

 二、解题思路

  Dijkstra的优化版,时间复杂度用优先队列优化,空间复杂度用链式前向星优化。(标准版直接交就行了)

三、代码实现

复制代码
 1 #include "bits/stdc++.h"
 2 #define PII pair<long long,long long>
 3 using namespace std;
 4 const int inf = INT_MAX;
 5 long long dis[100010];
 6 int vis[100100];
 7 struct node {
 8     int to;
 9     int from;
10     long long  w;
11 }graph[300010];
12 int fst[100100],nxt[301000];
13 priority_queue<PII,vector<PII>,greater<PII>> que;
14 int main()
15 {
16     ios::sync_with_stdio(false);
17     cin.tie(0);
18     cout.tie(0);
19     int n,m,s;
20     cin >> n >> m >> s;
21     for(int i = 1;i <= n;i++)
22         fst[i] = -1;
23     for(int i = 1;i <= m;i++){
24         cin >> graph[i].from >> graph[i].to >> graph[i].w;
25         nxt[i] = fst[graph[i].from];
26         fst[graph[i].from] = i;
27     }
28     for(int i = 1;i <= n;i++)
29         dis[i] = inf;
30     for(int i = fst[s];i != -1;i = nxt[i]){
31         dis[graph[i].to] = min(dis[graph[i].to],graph[i].w);
32         que.push(make_pair(dis[graph[i].to],graph[i].to));
33     }
34     vis[s] = 1;
35     dis[s] = 0;
36     while(!que.empty()){
37         PII v = que.top();
38         que.pop();
39         int id = v.second;
40         if(vis[id]) continue;
41         vis[id] = 1;
42         for(int j = fst[id];j != -1;j = nxt[j])
43             if(dis[graph[j].to] > v.first + graph[j].w){
44                 dis[graph[j].to] = graph[j].w + v.first;
45                 que.push(make_pair(dis[graph[j].to],graph[j].to));
46             } 
47     }
48     for(int i = 1;i <= n;i++)
49         cout << dis[i] << ' ';
50     return 0;
51 }
复制代码
posted @   scannerkk  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示