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 ...
随机推荐
- docker技术入门(1)
1Docker技术介绍 DOCKER是一个基于LXC技术之上构建的container容器引擎,通过内核虚拟化技术(namespace及cgroups)来提供容器的资源隔离与安全保障,KVM是通过硬件实 ...
- OSPF基本详解
- 移动端滚动选择器mobileSelect.js
一款多功能的移动端滚动选择器,支持单选到多选.支持多级级联.提供自定义回调函数.提供update函数二次渲染.重定位函数.兼容pc端拖拽等等.. 特性 原生js移动端选择控件,不依赖任何库 可传入普通 ...
- Git的使用(4) —— 分支的概念和使用
1. 概念 在SVN中,分支并不是很便于使用.但是在Git中,分支就变成了特别好用的功能呢,受到大多数使用者的青睐. 分支中有几个概念: (1) 分支:分支就是每一次提交创建的点连接成的线. (2) ...
- distribution system index
Resiliency:可译为容错性,强调从错误状态恢复的能力.形容词Resilient可译作“可容错的”. Elasticity:可译为伸缩性,强调根据负载进行水平伸缩的能力.形容词Elastic可译 ...
- JSON HiJacking攻击
JSON劫持类似于CSRF攻击,为了了解这种攻击方式,我们先看一下Web开发中一种常用的跨域获取数据的方式:JSONP. 先说一下JSON吧,JSON是一种数据格式,主要由字典(键值对)和列表两种存在 ...
- Python将多张图片进行合并拼接
import PIL.Image as Image import os IMAGES_PATH = r'D:\pics22223\\' # 图片集地址 IMAGES_FORMAT = ['.jpg', ...
- net.ipv4.tcp_fin_timeout的错误理解
按照文档的说法,貌似长久以来我对于tcp_fin_timeout的理解都是错误的 先备份在这里,再验证 提高Linux应对短连接的负载能力 在存在大量短连接的情况下,Linux的TCP栈一般都 ...
- 使用jquery循环并获取 json 数组的键/值对
var resultJSON = '{"FirstName":"John","LastName":"Doe"," ...
- Python3实战——爬虫入门
一.安装库 使用conda安装: conda install requests 如果出现解析环境问题,需要激活conda环境: https://www.cnblogs.com/jdemarryme/p ...