这道题就是让你求出有向图中最短路和比最短路长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 最短路和次短路 计数相关推荐

  1. 最短路和次短路问题,dijkstra算法

    1 /* 2 *题目大意: 3 *在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和; 4 * 5 *算法思想: 6 *用A*求第K短路,目测会超时,直接在dijkstra算 ...

  2. 什么原因导致芯片短路_PCB电路板短路的原因及解决方法-EDA/PCB-与非网

    [导读]焊接短路(如:连锡).PCB 短路(如:残铜.孔偏等).器件短路.组装短路.ESD/EOS 击穿.电路板内层微短路.电化学短路(如:化学残留.电迁移).其他原因造成的短路. 首先,了解一下常见 ...

  3. 解释一下java的短路运算,Java短路运算符和非短路运算符详解

    Java短路运算符和非短路运算符详解 时间:2017-09-15     来源:互联网 你了解Java短路运算符和非短路运算符吗?短路运算符就是我们常用的"&&". ...

  4. 你知道什么是 短路与 和 短路非吗 ???

    此链接通往 Bash Shell 编程学习的目录导航 ,从入门到放弃,感兴趣的可以去看看:   先来说一下 与运算 和 或运算: & 和 |: & 与 (双方都成立 ,结果才为 tru ...

  5. 短路与 短路或 不短路与 不短路或

    先来看牛客的一道题 如下语句通过算术运算和逻辑运算之后i和 j的结果是( ) int i=0; int j=0; if((++i>0)||(++j>0)) { //打印出i和j的值. } ...

  6. 针对常见的四种短路故障(单相接地短路,两相相间短路,两相接地短路,三相短路),可采取三种方法进行计算

    短路电流计算/ Matlab编程计算 针对常见的四种短路故障(单相接地短路,两相相间短路,两相接地短路,三相短路),可采取三种方法进行计算: 1.实用短路电流计算 2.对称分量法计算 3.节点导纳法计 ...

  7. 【图论算法】 最短路,次短路,k短路总结

    在图论里,最短路,次短路,k短路的问题很常见. 这里总结一下. 存图技巧 数据小,稠密图的一般用邻接矩阵 稀疏图,数据大一般用邻接表(vector,链式前向星都可) 邻接矩阵 const int ma ...

  8. 最短路及最短路计数(SPFA)

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...

  9. A*算法+最短路实现K短路+模板题

    <font color=black size=4>K短路问题还是很普遍的,了解一下K短路很有必要,顺便学会A*的简单应用更好. A*算法,是一种启发式搜索算法,我们可以自己设定一个估价函数 ...

最新文章

  1. TensorFlow解析常量、变量和占位符
  2. 股票交易应用系统的性能分析工具介绍(一)
  3. linuxsed替换字符串后保存_字符串方法——replace()
  4. 关于实现无限循环的做法
  5. 如何重新打开Windows防火墙提示?
  6. swiper.js插件的使用
  7. 最快理解使用CSS弹性盒子
  8. RHEL7中设置ssh
  9. C++中编译速度与平时代码规范
  10. python笔试题(一)
  11. Visual Studio 2011 Beta新特性(一):安装VS2011
  12. HP520 笔记本 驱动安装的一些问题
  13. C语言字谜游戏(函数嵌套、指针)
  14. 学习javaweb第四天
  15. 关于go module
  16. 华为MatePad Pro和华为MatePad区别
  17. ECCV2022论文汇总:检测/分割/跟踪/3D/深度估计/姿态解算等多个方向!
  18. DIS和EIS(数码防抖和电子防抖)
  19. 报表工具轻松搞定卡片式报表
  20. .CreateFeatureClass报错原因解析

热门文章

  1. 一张图带你看懂 ,web前端开发应该知道的HTML5六大趋势
  2. web前端网页开发离不开的三要素:HTML、CSS、JavaScript
  3. 用账号连无线网怎么连接网络连接服务器,路由器怎么共用一个宽带账号
  4. python中的t操作_Python: s[i:j:k] = t 实现的是什么操作啊?
  5. 两个结构体变量可以直接赋值吗_Gox语言中的结构类型-GX6
  6. HDU-2717-Catch That Cow(bfs)
  7. liunx下pytorch(python2.7)先前几个版本的安装(由于官网点击先前版本进不去)
  8. 在win10在使用cmder代替Linux是怎样的体验
  9. 奇异值与主成分分析(PCA)
  10. DI、IOC基础学习笔记