ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

数据结构-Dijskra(迪杰斯特拉)最短路径算法

2022-05-02 15:33:05  阅读:166  来源: 互联网

标签:node register temp int Dijskra 迪杰 num 数据结构 dis


题目链接:https://www.dotcpp.com/oj/problem1708.html

今天打算打一下午的最短路,刷上十道题最短路就算完结了,开刷

其实这道题挺迷的,这个题最大的坑点就是不能双向存图,我也不知道为什么不能存双边,但是存了双边就过不了,先不探究了,先刷题;

然后就是常规的djkstra了;

Talk is cheap. Show me the code.

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int num=100;
 4 const int INF=0x3f3f3f3f;
 5 int n;
 6 int s;
 7 struct edge
 8 {
 9     int from;
10     int to;
11     int w;
12     edge(int a,int b,int c)
13     {
14         from=a;
15         to=b;
16         w=c;
17     }
18 };
19 vector<edge>e[num];
20 struct node
21 {
22     int id;
23     int d;
24     node(int b,int c)
25     {
26         id=b;
27         d=c;
28     }
29     bool operator<(const node &a)const
30     {
31         return d>a.d;
32     }
33 };
34 int dis[num];
35 void dijkstra()
36 {
37     bool done[num];
38     for(register int i=0;i<n;i++)
39     {
40         dis[i]=INF;
41         done[i]=false;
42     }
43     dis[s]=0;
44     priority_queue<node>q;
45     q.push(node(s,dis[s]));
46     while(!q.empty())
47     {
48         node u=q.top();
49         q.pop();
50         if(done[u.id])
51         continue;
52         done[u.id]=true;
53         for(register int i=0;i<e[u.id].size();i++)
54         {
55             edge y=e[u.id][i];
56             if(done[y.to])
57             continue;
58             if(dis[y.to]>y.w+u.d)
59             {
60                 dis[y.to]=y.w+u.d;
61                 q.push(node(y.to,dis[y.to]));
62             }
63         }
64     }
65 //    printf("%d ",dis[n]);
66 }
67 int main()
68 {
69     std::ios::sync_with_stdio(false);
70     cin.tie(0);
71     cout.tie(0);
72     cin>>n>>s;
73     for(register int i=0;i<n;i++)
74     {
75         for(register int j=0;j<n;j++)
76         {
77             int temp;
78             cin>>temp;
79             if(temp)
80             {
81                 e[i].push_back(edge(i,j,temp));
82                 //e[j].push_back(edge(j,i,temp));    //不要存双边
83             }
84         }
85     }
86      dijkstra();
87     for(register int i = 0; i < n; i++){
88         if(i!=s){//跳过那个起点
89             if(dis[i] == INF){
90                 printf("-1 ");
91             }else{
92                 printf("%d ", dis[i]);
93             }
94         }
95     }
96     return 0;
97 }

 

标签:node,register,temp,int,Dijskra,迪杰,num,数据结构,dis
来源: https://www.cnblogs.com/LQS-blog/p/16215886.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有