题目:http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=208


#include <iostream>
#include <string.h>
#include <stdio.h>using namespace std;
const int N = 1005;
const int INF = 1<<30;int map[N][N];
int dist[N];
bool vis[N];
int n,m;void Init()
{memset(vis,0,sizeof(vis));for(int i=1; i<=n; i++)for(int j=1; j<=n; j++)map[i][j] = INF;
}void Dijkstra(int cur)
{vis[cur] = 1;for(int i=1; i<=n; i++)dist[i] = map[cur][i];dist[cur] = 0;for(int i=2; i<=n; i++){int k = cur;int minval = INF;for(int j=1; j<=n; j++){if(!vis[j] && dist[j] < minval){minval = dist[j];k = j;}}vis[k] = 1;for(int j=1; j<=n; j++){if(!vis[j])dist[j] = min(dist[j],dist[k] + map[k][j]);}}
}int main()
{while(~scanf("%d%d",&n,&m)){Init();for(int i=1;i<=m;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);u++; v++;map[u][v] = w;}int s,t;scanf("%d%d",&s,&t);s++; t++;Dijkstra(s);if(dist[t] == INF) puts("-1");else printf("%d\n",dist[t]);}return 0;
}

Dijkstra经过set优化后,时间复杂度可以将为O(n*log(n))

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <set>using namespace std;
const int N = 1005;
const int INF = 1 << 30;struct Edge
{int to;int w;int next;
};Edge edge[N*N];
int head[N],dist[N];
bool vis[N];
int cnt;struct cmp
{bool operator()(const int &a,const int &b) const{return dist[a] < dist[b] || (dist[a] == dist[b] && a < b);}
};set<int,cmp> s;void add(int u,int v,int w)
{edge[cnt].to = v;edge[cnt].next = head[u];edge[cnt].w = w;head[u] = cnt++;
}void Init()
{cnt = 0;s.clear();memset(head,-1,sizeof(head));memset(vis,0,sizeof(vis));for(int i=0;i<N;i++)dist[i] = INF;
}void Dijkstra(int v)
{dist[v] = 0;s.insert(v);while(!s.empty()){v = *s.begin();s.erase(v);vis[v] = 1;for(int i=head[v];~i;i=edge[i].next){int t = edge[i].to;if(!vis[t] && dist[t] > dist[v] + edge[i].w){s.erase(t);dist[t] = dist[v] + edge[i].w;s.insert(t);}}}
}int main()
{int n,m;while(~scanf("%d%d",&n,&m)){Init();for(int i=1;i<=m;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);add(u,v,w);}int s,t;scanf("%d%d",&s,&t);Dijkstra(s);if(dist[t] == INF) puts("-1");else printf("%d\n",dist[t]);}return 0;
}

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3790

题意:给你n个点,m条无向边,每条边都有长度d和花费c,给你起点s和终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有

多条路线,则输出花费最少的。


分析:本题是双重权值的最短路径问题,当然最法跟一般的最短路做法差不多。


#include <iostream>
#include <string.h>
#include <stdio.h>const int N = 1005;
const int INF = 1<<29;bool vis[N];
int d[N],c[N];
int map[N][N];
int cost[N][N];
int m,n,s,t;void Init()
{memset(vis,0,sizeof(vis));for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){map[i][j] = (i == j) ? 0 : INF;cost[i][j] = (i == j) ? 0 : INF;}}
}void Dijkstra(int cur)
{vis[cur] = 1;for(int i=1; i<=n; i++){d[i] = map[cur][i];c[i] = cost[cur][i];}for(int i=2; i<=n; i++){int k = cur;int minval = INF;for(int j=1; j<=n; j++){if(!vis[j] && d[j] < minval){minval = d[j];k = j;}}vis[k] = 1;for(int j=1; j<=n; j++){if(!vis[j]){if(d[j] > d[k] + map[k][j]){d[j] = d[k] + map[k][j];c[j] = c[k] + cost[k][j];}else if(d[j] == d[k] + map[k][j] && c[j] > c[k] + cost[k][j])c[j] = c[k] + cost[k][j];}}}if(d[t] == INF) puts("1");else printf("%d %d\n",d[t],c[t]);
}int main()
{while(~scanf("%d%d",&n,&m)){if(n==0 && m==0)  break;Init();while(m--){int u,v,x,y;scanf("%d%d%d%d",&u,&v,&x,&y);if((map[u][v] > x) || (map[u][v] == x && cost[u][v] > y)){map[u][v] = map[v][u] = x;cost[u][v] = cost[v][u] = y;}}scanf("%d%d",&s,&t);Dijkstra(s);}return 0;
}

单源最短路径(Dijkstra算法)相关推荐

  1. 分支限界法:单源最短路径--dijkstra算法

    单源最短路径–dijkstra算法 前面已经多次介绍过dijkstra算法是贪心算法,是动态规划,实际上可以从分支限界的角度来理解: 分支限界法 分支限界法,实际上就是回溯法,一般意义的回溯法是基于深 ...

  2. 数据结构与算法—单源最短路径dijkstra算法

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

  3. 单源最短路径dijkstra算法

    介绍 dijkstra算法也是解决单源最短路径问题的一种方法.它要求图中路径都是非负的.而且,它的效率要高于bellman算法. 实现 首先定义图的结点信息和边信息. struct _Node;typ ...

  4. 单源顶点最短路径java_单源最短路径-Dijkstra 算法

    Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问题:求a点到各个点的最短距离,如下图 ...

  5. JAVA编程求单源最短路径_【算法】单源最短路径——dijkstra算法

    一,概念 单源最短路径 给定一个带权有向图G=(V,E),其中每条边的权是一个实数.另外,还给定V中的一个顶点,称为源.要计算从源到其他所有各顶点的最短路径长度.这里的长度就是指路上各边权之和.这个问 ...

  6. dijkstra 算法_数据结构与算法—单源最短路径dijkstra算法

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

  7. 单源最短路径---Dijkstra算法

    有这样一道题:在一个图(如图所示)中,一共有四个点:1 2 3 4 这四个点之间各有相连,且每条边都有自己的权值.现在小明在点1上, 他想要到3去,请问最短路径是多少. 很容易得到该图的邻接矩阵.我们 ...

  8. 单源最短路径Dijkstra算法的思想、详细步骤、代码

    目录 一.算法思想 二.算法详细步骤 三.伪代码 + C++代码 四.算法复杂度分析 五.算法改进 六.应用案例 一.算法思想 1.Dijkstra 算法是用来求解单源最短路径问题的经典算法,其本质上 ...

  9. 单源最短路径Dijkstra算法升级:出现多条最短路径,输出之?

    文章目录 引言:单条路径的标配算法 进阶:记录多条路径的改进版Dijkstra算法: 1. 对`P[]`数组进行扩充 2. 求最短路径条数 3. 输出所有最短路径 引言:单条路径的标配算法 一个普通. ...

最新文章

  1. spring cloud微服务分布式云架构(四)-断路器(Hystrix)
  2. 大数据常见组件的访问页面总结
  3. ssd网络结构_封藏的SSD(Single Shot MultiBox Detector)笔记
  4. 从你的全世界路过-论演员的自我修养
  5. matlab作业5答案,《matlab作业题答案》.doc
  6. 建模大师怎么安装到revit中_工程师最爱的REVIT插件,让BIM建模溜到飞起!
  7. eureka自我保护时间_Eureka的自我保护机制
  8. MYSQL单列索引和组合索引分析
  9. Windows编译Nginx源码
  10. 软考分类精讲-软件管理
  11. 人机交互选择判断练习题
  12. 一个小技巧告诉你,邮箱域名地址格式怎么选择?
  13. AndroidStudio模拟器全面屏皮肤
  14. 【机器学习入门到精通系列】OVR SVMs
  15. 计算机网络 学习通 第三章作业
  16. unity 角色鉴赏 spine动画鉴赏人物
  17. Java设计模式—模板模式(Template)
  18. javascript中childNodes与children的区别
  19. 开始写老虎证券美股策略
  20. 为什么使用 CE + Softmax 作为损失函数

热门文章

  1. spring cloud netflix
  2. 微服务架构的实施现状
  3. Redis中的可用性保证之Sentinel的Ratf 算法
  4. 微服务宏观把控与深入剖析
  5. 设计模式之_Strategy_03
  6. mysql+%3c%3e+cdata,bbed 使用实现 drop index 操作
  7. php短信接口加密_PHP短信接口、PHP短信验证码接口源码
  8. matlabk大于等于0如何表示_【底层原理】浮点数在计算机中是如何表示
  9. 响应文件是不是标书_什么是标书?投标书有哪些分类?标书和投标书的不同?...
  10. PyTorch深度学习实践06