PAT甲级 Dijkstra 相关题_C++题解
Dijkstra
PAT (Advanced Level) Practice Dijkstra 相关题
目录
- 《算法笔记》重点摘要
- 1003 Emergency (25)
《算法笔记》 10.4.1 Dijkstra 重点摘要
对任意给出的图 G(V,E) 和 起点 S,终点 T,求 S 到 T 的最短路径
1. 简介
- 解决单源最短路问题
- 只能处理所有边权均非负的情况
若出现负数,最好使用 SPFA 算法
2. 邻接矩阵
const int MAXV = 1000;
const int INF = 0x3fffffff;
int n, G[MAXV][MAXV], d[MAXV], pre[MAXV];
bool vis[MAXV] = {false};
void Dijkstra(int s){
fill(d, d + MAXV, INF);
d[s] = 0;
for (int i = 0; i < n; i++) pre[i] = i;
for (int i = 0; i < n; i++){
int u = -1, MIN = INF;
for (int j = 0; j < n; j++){ // 找未访问结点中 d[] 最小的
if (!vis[j] && d[j] < MIN){
u = j;
MIN = d[j];
}
}
if (u == -1) return; // 找不到 d[u] < INF 点,说明剩下的点与起点 s 不连通
vis[u] = true;
for (int v = 0; v < n; v++){
if (!vis[v] && G[u][v] != INF && d[u] + G[u][v] < d[v]){
d[v] = d[u] + G[u][v];
pre[v] = u;
}
}
}
}
void DFS(int s, intv){
if (v == s){
printf("%d", s);
return;
}
DFS(s,pre[v]);
printf(" %d", v);
}
3. 第二标尺
第一标尺为距离
(1) 新增边权
如边的花费
int cost[MAXV][MAXV], c[MAXV];
fill(c, c + MAXV, INF);
c[s] = 0;
for (int v = 0; v < n; v++){
if (!vis[v] && G[u][v] != INF){
if (d[u] + G[u][v] == d[v] && c[u] + cost[u][v] < c[v]){
pre[v] = u;
c[v] = c[u] + cost[u][v];
}
else if (d[u] + G[u][v] < d[v]){
pre[v] = u;
d[v] = d[u] + G[u][v];
c[v] = c[u] + cost[u][v];
}
}
}
(2) 新增点权
如点的权重
int weight[MAXV], w[MAXV] = {0};
w[s] = weight[s];
for (int v = 0; v < n; v++){
if (!vis[v] && G[u][v] != INF){
if (d[u] + G[u][v] == d[v] && w[u] + weight[v] > w[v]){
pre[v] = u;
w[v] = w[u] + weight[v];
}
else if (d[u] + G[u][v] < d[v]){
pre[v] = u;
d[v] = d[u] + G[u][v];
w[v] = w[u] + weight[v];
}
}
}
(3) 求最短路径条数
int num[MAXV] = {0};
num[s] = 1;
for (int v = 0; v < n; v++){
if (!vis[v] && G[u][v] != INF){
if (d[u] + G[u][v] == d[v]{
pre[v] = u;
num[v] += num[u];
}
else if (d[u] + G[u][v] < d[v]){
pre[v] = u;
d[v] = d[u] + G[u][v];
num[v] = num[u];
}
}
}
1003 Emergency (25)
题目思路
- 两个标尺:距离,点权;且要求最短路径数
#include<iostream>
using namespace std;
const int MAXN = 500, INF = 0x3fffffff;
int n, s, t, G[MAXN][MAXN], weight[MAXN], d[MAXN], pathnum[MAXN], w[MAXN] = {0};
bool vis[MAXN] = {false};
void Dijkstra(){
fill(d, d + MAXN, INF);
d[s] = 0;
pathnum[s] = 1;
w[s] = weight[s];
for (int i = 0; i < n; i++){
int u = -1, MIN = INF;
for (int j = 0; j < n; j++){
if (!vis[j] && d[j] < MIN){
u = j;
MIN = d[j];
}
}
vis[u] = true;
for (int v = 0; v < n; v++){
if (!vis[v] && G[u][v] != INF){
if (d[v] == d[u] + G[u][v]){
pathnum[v] += pathnum[u];
if (w[v] < w[u] + weight[v]) w[v] = w[u] + weight[v];
}
else if (d[v] > d[u] + G[u][v]){
d[v] = d[u] + G[u][v];
w[v] = w[u] + weight[v];
pathnum[v] = pathnum[u];
}
}
}
}
}
int main()
{
int m, u, v, len;
scanf("%d%d%d%d", &n, &m, &s, &t);
for (int i = 0; i < n; i++) scanf("%d", &weight[i]);
fill(G[0], G[0] + MAXN * MAXN, INF);
for (int i = 0; i < m; i++){
scanf("%d%d%d", &u, &v, &len);
G[u][v] = len;
G[v][u] = len;
}
Dijkstra();
printf("%d %d", pathnum[t], w[t]);
return 0;
}
fill(G[0], G[0] + MAXN * MAXN, INF)
注意二维数组要取首地址作为指针类型不能直接用数组名,因为它相当于是一维数组的指针,而参数要求是指针
PAT甲级 Dijkstra 相关题_C++题解的更多相关文章
- PAT甲级 二叉树 相关题_C++题解
二叉树 PAT (Advanced Level) Practice 二叉树 相关题 目录 <算法笔记> 重点摘要 1020 Tree Traversals (25) 1086 Tree T ...
- PAT甲级 二叉查找树 相关题_C++题解
二叉查找树 PAT (Advanced Level) Practice 二叉查找树 相关题 目录 <算法笔记> 重点摘要 1099 Build A Binary Search Tree ( ...
- PAT甲级 图 相关题_C++题解
图 PAT (Advanced Level) Practice 用到图的存储方式,但没有用到图的算法的题目 目录 1122 Hamiltonian Cycle (25) 1126 Eulerian P ...
- PAT甲级 树 相关题_C++题解
树 目录 <算法笔记>重点摘要 1004 Counting Leaves (30) 1053 Path of Equal Weight (30) 1079 Total Sales of S ...
- PAT甲级 堆 相关题_C++题解
堆 目录 <算法笔记>重点摘要 1147 Heaps (30) 1155 Heap Paths (30) <算法笔记> 9.7 堆 重点摘要 1. 定义 堆是完全二叉树,树中每 ...
- PAT甲级 散列题_C++题解
散列 PAT (Advanced Level) Practice 散列题 目录 <算法笔记> 重点摘要 1002 A+B for Polynomials (25) 1009 Product ...
- PAT甲级 字符串处理题_C++题解
字符串处理题 目录 <算法笔记> 重点摘要 1001 A+B Format (20) 1005 Spell It Right (20) 1108 Finding Average (20) ...
- PAT甲级 并查集 相关题_C++题解
并查集 PAT (Advanced Level) Practice 并查集 相关题 <算法笔记> 重点摘要 1034 Head of a Gang (30) 1107 Social Clu ...
- PAT甲级 图的遍历 相关题_C++题解
图的遍历 PAT (Advanced Level) Practice 图的遍历 相关题 目录 <算法笔记>重点摘要 1021 Deepest Root (25) 1076 Forwards ...
随机推荐
- ACL终极详解
- fluent中interpolate的用法
原视频下载地址: https://pan.baidu.com/s/1hTD6tIlYL1S0nm30riAD9w 密码: ngv9
- 第1课_Java基础知识【学习笔记】
摘要:韦东山android视频学习笔记 一.android系统的基本框架如图一所示,应用程序是用java编写的,底层驱动是用C代码写的,java与C怎么连接在一起主要是通过本地服务.android系统 ...
- CMU Database Systems - Parallel Execution
并发执行,主要为了增大吞吐,降低延迟,提高数据库的可用性 先区分一组概念,parallel和distributed的区别 总的来说,parallel是指在物理上很近的节点,比如本机的多个线程或进程,不 ...
- eclipse remote system explorer operation
Remote System Explorer Operation卡死Eclipse解决方案 - 披萨大叔的博客 - CSDN博客https://blog.csdn.net/qq_27258799/ar ...
- js中const,var,let区别与用法(转)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_36784628/article/d ...
- windows下安装node【转】
windows下安装node报错2503.2502 windows下命令行安装,首先使用管理员权限获取cmd msiexec /package node-v10.16.0-x64.msi 根据提示一步 ...
- 对有序特征进行离散化(继承Spark的机器学习Estimator类)
采用信息增益或基尼指数寻找最优离散化点 package org.apache.spark.ml.feature import org.apache.spark.sql.SparkSession imp ...
- Mockplus更快更简单的原型设计
更快更简单的原型设计 https://www.mockplus.cn/ Mockplus,更快更简单的原型设计工具.快速创建原型,一键拖拽创建交互,团队协作省事省力.微软.华为.东软.育碧.Oracl ...
- realsense SDK编译 release
1>------ 已启动生成: 项目: ZERO_CHECK, 配置: Release x64 ------1> Checking Build System1> CMake does ...