dijkstra的代码思想网上各路高手所述备矣。这里只是存下用邻接矩阵和邻接表实现的dijkstra。(白书代码)

  邻接矩阵

 1 void dijkstra(int s){
2 int dis[s]=0;
3 while(1){
4 int v=0; //从尚未使用过的顶点中选择一个距离最小的顶点
5 for(int u=1;u<=n;u++){
6 if(!used[u]&&dis[v]>dis[u])
7 v=u;
8 }
9 if(!v) break;
10 used[v]=1;
11 for(int u=1;u<=n;u++){
12 dis[u]=min(dis[u],dis[v]+dis[v][u]);
13 }
14 }
15 }

    堆优化的dijkstra

 1 struct edge{int to,cost;};
2 typedef pair<int ,int > P;
3
4 int V;
5 vector<int>G[Max];
6 int d[Max];
7
8 void dijkstra(int s){
9 priority_queue<P>,vector<P>,greater<P> >que;//通过指定greater<P>参数
10 que.push(P(0,s)); //堆按照first从小到大的顺序取出值
11
12 while(!que.empty()){
13 P p=que.top();que.pop();
14 int v=p.second;
15 if(d[v]<p.first) continue;
16 for(int i=0;i<G[v].size();i++){
17 edge e=G[v][i];
18 if(d[e.to]>d[v]+e.cost){
19 d[e.to]=d[v]+e.cost;
20 que.push(P(d[e.to],e.to));
21 }
22 }
23 }
24 }
25
26

例题:hdu-2544 最短路

在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

Input输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
Output对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间Sample Input

2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0

Sample Output

3
2

这题就是单纯的套模板
附本人堆优化dijkstra的ac代码
 1 #include <cstdio>
2 #include <cstring>
3 #include <queue>
4 #include <vector>
5 const int Max = 111111;
6 const int inf = 0x3f3f3f3f;
7 using namespace std;
8 struct edge{int to,cost;};
9 vector<edge>G[Max];
10 int d[Max];
11 typedef pair<int,int>P;
12 void dijkstra(){
13 priority_queue<P,vector<P>,greater<P> >que;
14 d[0]=0;
15 que.push(P(0,0));
16 while(!que.empty()){
17 P p=que.top();que.pop();
18 // printf("%d ",p.first);
19 int v=p.second;
20 if(d[v]<p.first) continue;
21 for(int i=0;i<G[v].size();i++){
22 edge e=G[v][i];
23 if(d[e.to]>d[v]+e.cost){
24 // printf("%d ",d[e.to]);
25 d[e.to]=d[v]+e.cost;
26 que.push(P(d[e.to],e.to));
27 }
28 }
29 }
30 }
31 int main(){
32 int n,m;
33 while(~scanf("%d %d",&n,&m),n+m){
34 memset(d,inf,sizeof(d));
35 int a,b,c;
36 for(int i=0;i<m;i++){
37 scanf("%d %d %d",&a,&b,&c);
38 a-=1;
39 b-=1;
40 edge e;
41 e.to=b;e.cost=c;
42 G[a].push_back(e);
43 e.to=a;
44 G[b].push_back(e);
45 }
46 dijkstra();
47 printf("%d\n",d[n-1]);
48 for(int i=0;i<m;i++)
49 G[i].clear();
50 }
51 return 0;
52 }
附本人邻接矩阵的ac代码
 1 #include<cstdio>
2 #include<cstring>
3 #include<vector>
4 #include<algorithm>
5 #include<iostream>
6 #include<queue>
7
8 using namespace std;
9
10 const int inf = 0x3f3f3f3f;
11
12 int mp[105][105],dis[105],used[105],n;
13
14 void dijkstra(){
15 for(int i=1;i<=n;i++){
16 dis[i]=mp[1][i];
17 }
18 // for(int i=1;i<=n;i++)
19 // cout << mp[1][i] <<endl;
20 dis[1]=0;
21 used[1]=1;
22 while(1){
23 int minn=inf,u=-1;
24 for(int i=1;i<=n;i++){
25 if(minn>dis[i]&&used[i]==0){
26 minn=dis[i];
27 u=i;
28 }
29 }
30 used[u]=1;
31 if(u==-1) break;
32 for(int i=1;i<=n;i++){
33 int temp=min(inf,dis[u]+mp[u][i]);
34 if(dis[i]>temp){
35 dis[i]=temp;
36 }
37 }
38 }
39 }
40 int main(){
41 ios::sync_with_stdio(false);
42 int m,i,j,a,b,c;
43 while(cin >> n >> m,n||m){
44 memset(dis,0,sizeof(dis));
45 memset(mp,inf,sizeof(mp));
46 memset(used,0,sizeof(used));
47 for(i=0;i<m;i++){
48 cin >> a >> b >> c;
49 mp[a][b] = c;
50 mp[b][a] = c;
51 }
52 dijkstra();
53
54 cout << dis[n] << endl;
55 }
56 return 0;
57 }

 

最新文章

  1. mysql+ssh 配置(转载)
  2. MFC关闭子窗口 如何把父窗口也一起关闭
  3. shell字符串的截取
  4. Karaf 基于 osgi
  5. [LeetCode#191]Number of Bits
  6. 「Poetize3」导弹防御塔
  7. C#从SQL server数据库中读取l图片和存入图片
  8. 分析器错误(在浏览器中查看.aspx)
  9. 2018/2/14 设计模式学习笔记(一) 自己实现ArrayList,LinkedList和Iterator,以及在此过程中对于面向对象,面向接口,还有抽象类的一些思考感悟
  10. 安卓开发笔记(十):升级ListView为RecylerView的使用
  11. java_IO流
  12. zabbix Server 4.0 部署及之内置item使用案例
  13. 【QT】qt python install pip
  14. [Windows]卸载Office 2016密钥
  15. 常见的web攻击手段
  16. delphi 实现两个exe文件共享内存映像的代码
  17. javascript技巧及常用事件方法集合(全)
  18. bzoj1643 / P2666 [Usaco2007 Oct]Bessie&#39;s Secret Pasture 贝茜的秘密草坪
  19. TMOD
  20. javascript-删除节点

热门文章

  1. Java中的基本数据类型与引用数据类型
  2. JavaSE 基础知识(常识概念 + 基础语法)问答总结/面试题 —— 讲给应届生的 Java 开源知识项目
  3. Core3.1 微信v3 JSAPI支付
  4. Linux Centos7之由Python2升级到Python3教程
  5. 简单的DbContext工厂类(EFCore)
  6. Vue基础之插值表达式的另一种用法!附加变量的监听!
  7. CSSmargin击穿问题(子元素margin-top会影响父元素)
  8. MySQL 压测
  9. 一个支付宝小程序在一段时间内只能保留一个 WebSocket 连接
  10. go语言rpc学习