poj3463 最短路和次短路 计数
这道题就是让你求出有向图中最短路和比最短路长1的路的数量, 我们求出次短路和最短路的数量即可解决这道题
/* 求s到t的最短路与次短路(这里要求只比最短路多1)的条数之和 联想到最小,次小的一种更新关系: if(x<最小)更新最小,次小 else if(==最小)更新方法数 else if(x<次小)更新次小 else if(x==次小)更新方法数 同时记录s到u最短,次短路及方法数 用一个堆每次取最小的,更新完后再入堆 还是那个原理,第一次遇到的就是最优的,然后vi标记为真 方法数注意是加法原理,不是乘法 \ -- u -- v 所以是加法原理 / */
代码如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue>using namespace std; const int maxn = 1000 + 10; const int inf = 0x3f3f3f3f; int N, M; struct edge { int v, c; }; vector<edge> G[maxn]; int S, F;struct Dij {int u, c, flog;bool operator< (const Dij& r) const{return c>r.c;} };int dist[maxn][2], vis[maxn][2], dp[maxn][2]; void dijkstra() {memset(dist, 0x3f, sizeof(dist));memset(vis, 0, sizeof(vis));memset(dp, 0, sizeof(dp));dp[S][0]=1; dist[S][0]=0;priority_queue<Dij> que;que.push((Dij){S, 0, 0});while(!que.empty()){Dij tp = que.top(); que.pop();int u = tp.u, flog = tp.flog; //使用这个状态更新其他的if(vis[u][flog]) continue;vis[u][flog] = 1;for(int i=0; i<G[u].size(); i++){int v = G[u][i].v, c = G[u][i].c;int w = dist[u][flog] + c;if(w < dist[v][0]) //更新次短路 最短路
{if(dist[v][0] != inf){dist[v][1] = dist[v][0];dp[v][1] = dp[v][0];que.push((Dij){v, dist[v][1], 1});}dist[v][0] = w;dp[v][0] = dp[u][flog];que.push((Dij){v, dist[v][0], 0});}else if(w == dist[v][0]) //更新方法数dp[v][0] += dp[u][flog];else if(w < dist[v][1]) //更新次短路 {dist[v][1] = w;dp[v][1] = dp[u][flog];que.push((Dij){v, dist[v][1], 1});}else if(w == dist[v][1]) //更新方法数dp[v][1] += dp[u][flog];}} }int main() {int T;scanf("%d", &T);while(T--){scanf("%d%d", &N, &M);for(int i=0; i<=N; i++) G[i].clear();for(int i=0; i<M; i++){int u, v, t;scanf("%d%d%d", &u, &v, &t);G[u].push_back((edge){v, t});//G[v].push_back((edge){u, t}); }scanf("%d%d", &S, &F);dijkstra();if(dist[F][1]-dist[F][0] == 1)printf("%d\n", dp[F][0]+dp[F][1]);elseprintf("%d\n", dp[F][0]);}return 0; }
转载于:https://www.cnblogs.com/xingxing1024/p/5224363.html
poj3463 最短路和次短路 计数相关推荐
- 最短路和次短路问题,dijkstra算法
1 /* 2 *题目大意: 3 *在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和; 4 * 5 *算法思想: 6 *用A*求第K短路,目测会超时,直接在dijkstra算 ...
- 什么原因导致芯片短路_PCB电路板短路的原因及解决方法-EDA/PCB-与非网
[导读]焊接短路(如:连锡).PCB 短路(如:残铜.孔偏等).器件短路.组装短路.ESD/EOS 击穿.电路板内层微短路.电化学短路(如:化学残留.电迁移).其他原因造成的短路. 首先,了解一下常见 ...
- 解释一下java的短路运算,Java短路运算符和非短路运算符详解
Java短路运算符和非短路运算符详解 时间:2017-09-15 来源:互联网 你了解Java短路运算符和非短路运算符吗?短路运算符就是我们常用的"&&". ...
- 你知道什么是 短路与 和 短路非吗 ???
此链接通往 Bash Shell 编程学习的目录导航 ,从入门到放弃,感兴趣的可以去看看: 先来说一下 与运算 和 或运算: & 和 |: & 与 (双方都成立 ,结果才为 tru ...
- 短路与 短路或 不短路与 不短路或
先来看牛客的一道题 如下语句通过算术运算和逻辑运算之后i和 j的结果是( ) int i=0; int j=0; if((++i>0)||(++j>0)) { //打印出i和j的值. } ...
- 针对常见的四种短路故障(单相接地短路,两相相间短路,两相接地短路,三相短路),可采取三种方法进行计算
短路电流计算/ Matlab编程计算 针对常见的四种短路故障(单相接地短路,两相相间短路,两相接地短路,三相短路),可采取三种方法进行计算: 1.实用短路电流计算 2.对称分量法计算 3.节点导纳法计 ...
- 【图论算法】 最短路,次短路,k短路总结
在图论里,最短路,次短路,k短路的问题很常见. 这里总结一下. 存图技巧 数据小,稠密图的一般用邻接矩阵 稀疏图,数据大一般用邻接表(vector,链式前向星都可) 邻接矩阵 const int ma ...
- 最短路及最短路计数(SPFA)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- A*算法+最短路实现K短路+模板题
<font color=black size=4>K短路问题还是很普遍的,了解一下K短路很有必要,顺便学会A*的简单应用更好. A*算法,是一种启发式搜索算法,我们可以自己设定一个估价函数 ...
最新文章
- TensorFlow解析常量、变量和占位符
- 股票交易应用系统的性能分析工具介绍(一)
- linuxsed替换字符串后保存_字符串方法——replace()
- 关于实现无限循环的做法
- 如何重新打开Windows防火墙提示?
- swiper.js插件的使用
- 最快理解使用CSS弹性盒子
- RHEL7中设置ssh
- C++中编译速度与平时代码规范
- python笔试题(一)
- Visual Studio 2011 Beta新特性(一):安装VS2011
- HP520 笔记本 驱动安装的一些问题
- C语言字谜游戏(函数嵌套、指针)
- 学习javaweb第四天
- 关于go module
- 华为MatePad Pro和华为MatePad区别
- ECCV2022论文汇总:检测/分割/跟踪/3D/深度估计/姿态解算等多个方向!
- DIS和EIS(数码防抖和电子防抖)
- 报表工具轻松搞定卡片式报表
- .CreateFeatureClass报错原因解析
热门文章
- 一张图带你看懂 ,web前端开发应该知道的HTML5六大趋势
- web前端网页开发离不开的三要素:HTML、CSS、JavaScript
- 用账号连无线网怎么连接网络连接服务器,路由器怎么共用一个宽带账号
- python中的t操作_Python: s[i:j:k] = t 实现的是什么操作啊?
- 两个结构体变量可以直接赋值吗_Gox语言中的结构类型-GX6
- HDU-2717-Catch That Cow(bfs)
- liunx下pytorch(python2.7)先前几个版本的安装(由于官网点击先前版本进不去)
- 在win10在使用cmder代替Linux是怎样的体验
- 奇异值与主成分分析(PCA)
- DI、IOC基础学习笔记