设每个点到1的距离为dis[x]dis[x]dis[x],特殊边为(1,vi,wi)(1,v_i,w_i)(1,vi​,wi​)
1、wi>dis[vi]w_i>dis[v_i]wi​>dis[vi​]的特殊边可以删除
2、wi=dis[vi]且num[vi]>1w_i=dis[v_i]且num[v_i]>1wi​=dis[vi​]且num[vi​]>1,特殊边可以删掉

思路上的偏差:num[vi]=num[v_i]=num[vi​]= 到viv_ivi​的最短路的数量
实际:num[vi]=num[v_i]=num[vi​]= 从viv_ivi​出发有几条边可作为最短路的一部分
错因:

显然,删除①对是否删除②没有影响

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<ll,int> pr;
const int N=1e5+5;
const int M=4e5+5;
const int inf=0x3f3f3f3f;
struct Edge{int v,w,nxt;
}edge[M<<1];
bool vis[N];
ll dis[N];
int n,m,k,head[N],cnt;
int hd[N],ex,nxt[N],val[N],num[N],ans;
priority_queue<pr,vector<pr> ,greater<pr> > q;
void add(int u,int v,int w){edge[++cnt].v=v;edge[cnt].w=w;edge[cnt].nxt=head[u];head[u]=cnt;
}
void dijkstra(int s){for(int i=1;i<=n;i++) dis[i]=inf;for(int i=1;i<=n;i++) vis[i]=0;dis[s]=0;q.push(make_pair(0,s));while(!q.empty()){pr tmp=q.top();q.pop();int u=tmp.second;if(vis[u]) continue;vis[u]=1;for(int i=hd[u];i;i=nxt[i]){if(val[i]>dis[u]) ans++;else if(val[i]==dis[u]&&num[u]>1){num[u]--;ans++;}}for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].v;int w=edge[i].w;if(dis[v]>dis[u]+1ll*w){dis[v]=dis[u]+1ll*w;num[v]=1;q.push(pr(dis[v],v));}else if(dis[v]==dis[u]+1ll*w) num[v]++;}}
}
int main(){scanf("%d%d%d",&n,&m,&k);int u,v,w,s,y;for(int i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&w);add(u,v,w);add(v,u,w);}for(int i=1;i<=k;i++){scanf("%d%d",&s,&y);nxt[++ex]=hd[s];val[ex]=y;hd[s]=ex;add(1,s,y);add(s,1,y);}dijkstra(1);printf("%d\n",ans);return 0;
}

CF449B Jzzhu and Cities(Dijkstra)相关推荐

  1. CF449B Jzzhu and Cities 迪杰斯特拉最短路算法

    CF449B Jzzhu and Cities 其实这一道题并不是很难,只是一个最短路而已,请继续看我的题解吧~(^▽^) AC代码: #include<bits/stdc++.h> #d ...

  2. 手撕迪杰斯特拉算法(Dijkstra)及代码(附图解)

    文章目录 迪杰斯特拉(Dijkstra)算法 1.算法思想及其步骤 2.代码 2.1 相关声明 2.2 有权图的建立函数定义 2.3 核心算法:迪杰斯特拉 迪杰斯特拉(Dijkstra)算法 引言:我 ...

  3. 迪克斯特拉(Dijkstra)算法之MATLAB实现

    by WC 1.12.2016 1. 迪克斯特拉(Dijkstra)算法 在网上面看了很多的解释,仍没有感觉到有非常通熟易懂的解释,在这里我为大家讲解一下,尽量避免枯燥难懂的数学公式. 狄克斯特拉算法 ...

  4. 迪杰斯特拉(Dijkstra)算法之两点之间的最短距离问题

    1.概述 (1)与弗洛伊德(Floyd)算法一样,迪杰斯特拉(Dijkstra)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法,主要特点是以出发点为中心向外层层扩展(广度优先搜索思想),直到扩 ...

  5. Java图结构-模拟校园地图-迪杰斯特拉(Dijkstra)算法求最短路径 #谭子

    目录目录 一.前言 二.模拟校园地图描述 三.分析题目及相关绘图 四.代码部分 1.GraphNode类 2.Menu类(管理文字) 3.Attraction类 4.AttractionGraph类( ...

  6. 浅谈迪杰斯特拉(Dijkstra)算法和A*算法原理及实现

    写在前面 最近我在学习一门名叫<智能自主机器人及系统>的课程,虽然跟过去所学的<机器人学>在部分内容上有所重复,但该课程的应用性更强.对于不同的机器人,如差速轮式车.四轮车.四 ...

  7. 数据结构——迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉算法又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题.迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点 ...

  8. 最短路——小木乃伊到我家(dijkstra)

    题目链接 最短路--小木乃伊到我家(dijkstra) 题目描述 AA的欧尼酱qwb是个考古学家,有一天qwb发现了只白白圆圆小小的木乃伊,它是个爱哭鬼却很努力.qwb想把这么可爱的小木乃伊送给 AA ...

  9. 迪杰斯特拉算法(Dijkstra)求最短路径Python

    迪杰斯塔拉(Dijkstra)算法求最短路径 序 关于Dijkstra Dijkstra算法讲解 Dijkstra算法的弊端 第一步:进行初始化 第二步:主程序开始 又是初始化 核心的核心[^5] 最 ...

最新文章

  1. Linux主辅DNS数据不同步故障排除
  2. 10.递归是神马?recursion
  3. Objective-C iOS纯代码布局 一堆代码可以放这里!
  4. 嵌入式linux系统移植的四大步骤_如何移植开源软件到嵌入式Linux系统
  5. laravel api_如何在现有的Laravel应用中获取即时GraphQL API
  6. 一句话解释什么是回归
  7. 简单maxPooling单层网络句子分类框架和数学理论
  8. 明小子3.5检测网站应用
  9. 三星java手机播放器下载_8k视频播放器软件下载安卓-三星8k视频播放器KMPlayer下载v30.10.231 内置提取版-西西软件下载...
  10. 3dmax:3dmax三维建模中常用的渲染设置【明暗器基本参数】、Standard的材质、光线跟踪、合成、混合、建筑、无光/投影、混合实例 、多维子对象之详细攻略
  11. 昌乐博闻学校2021年高考成绩查询,2021高考难度升级吗?两点忠告送给高考生
  12. 一个页面中使用多个iframe导致在ie中假死问题的解决方法
  13. 【XJTUSE计算机图形学】第三章 几何造型技术(3)——B样条曲线与曲面
  14. 阿里云服务器镜像操作系统如何选择?阿里云镜像注意事项
  15. JAVA异常记录(ORA-56900:pivot|unpivot 操作内不支持绑定变量)
  16. IMX6DL 在Android4.4.2版本插入SD卡不能开机
  17. 发一个随机红包 100块钱给10个人 每个人最多12块钱 最少6块钱 怎么分
  18. 利用泰勒公式求sin(x)近似值(Python)
  19. 异常状态及发生率计算
  20. Linux紧急模式问题处理方法

热门文章

  1. android平板 useragent,移动端适配 user-Agent
  2. 量子计算机与新型传感器,新型量子传感器为超导量子计算机发展开辟了新路径...
  3. lnmp无法远程连接mysql_MySQL(一):设置root 可以远程连接MySQL
  4. C++实现各种选择排序(简单选择排序,堆排序)
  5. 《C++ Primer》7.1.4节练习
  6. 《C++ Primer》1.52节练习
  7. 题目 2285: [蓝桥杯][2018年第九届真题]螺旋折线(数论+思维)
  8. 批量将PPM格式图片转化为JPG格式
  9. word List36
  10. vilatile 深入理解java虚拟机_深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)...