http://acm.hdu.edu.cn/showproblem.php?pid=1688

这道题就是求最短路路径和次短路路径的条数。

用一个二维数组记录每一个节点距离起始点的最短距离和次短距离,再开一个二维数组记录路径数

更新状态时:

1)新值小于最短路径长:更新最短路径长,计数;次短路径长,计数

2)新值等于最短路径长:更新最短路径计数

3)新值大于最短路径长,小于次短路径长:更新次短路径长,计数

4)新值等于次短路径长:更新次短路径计数

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <vector>
  4 #include <queue>
  5 #include <algorithm>
  6 #define maxn 2000
  7 using namespace std;
  8 const int inf=1<<30;
  9 struct edge
 10 {
 11     int v,w;
 12 };
 13
 14 struct node
 15 {
 16     int d,v;
 17     int mark;
 18     bool operator < (const node &a)const
 19     {
 20         if(d!=a.d)
 21             return d>a.d;
 22         return v>a.v;
 23     }
 24 };
 25
 26 vector<edge>edges[maxn];
 27 int dis[maxn][3];
 28 int vis[maxn][3];
 29 int path[maxn][3];
 30 int n,m,a,b,c,s1,f;
 31 node st;
 32
 33
 34 void inti()
 35 {
 36     for(int i=0; i<=n; i++)
 37     {
 38         dis[i][1]=dis[i][2]=inf;
 39     }
 40     memset(path,0,sizeof(path));
 41     memset(vis,false,sizeof(vis));
 42 }
 43
 44 void dijkstra(int s,int e)
 45 {
 46     inti();
 47     priority_queue<node>q;
 48     dis[s][1]=0;
 49     path[s][1]=1;
 50     memset(vis,false,sizeof(vis));
 51     st.d=0; st.v=s;
 52     st.mark=1;
 53     q.push(st);
 54     while(!q.empty())
 55     {
 56         node st1=q.top(); q.pop();
 57         if(vis[st1.v][st1.mark]) continue;
 58         vis[st1.v][st1.mark]=true;
 59         for(int i=0; i<(int)edges[st1.v].size(); i++)
 60         {
 61              int v1=edges[st1.v][i].v;
 62              int w1=edges[st1.v][i].w;
 63              if(!vis[v1][1]&&st1.d+w1<dis[v1][1])
 64              {
 65                  if(dis[v1][1]!=inf)
 66                  {
 67                      dis[v1][2]=dis[v1][1];
 68                      path[v1][2]=path[v1][1];
 69                      st.d=dis[v1][2]; st.v=v1; st.mark=2;
 70                      q.push(st);
 71                  }
 72                  dis[v1][1]=st1.d+w1;
 73                  path[v1][1]=path[st1.v][st1.mark];
 74                  st.v=v1; st.mark=1; st.d=dis[v1][1];
 75                  q.push(st);
 76              }
 77              else if(!vis[v1][1]&&st1.d+w1==dis[v1][1])
 78              {
 79                  path[v1][1]+=path[st1.v][st1.mark];
 80              }
 81              else if(!vis[v1][2]&&st1.d+w1<dis[v1][2])
 82              {
 83                  dis[v1][2]=st1.d+w1;
 84                  path[v1][2]=path[st1.v][st1.mark];
 85                  st.d=dis[v1][2]; st.v=v1; st.mark=2;
 86                  q.push(st);
 87              }
 88              else if(!vis[v1][2]&&st1.d+w1==dis[v1][2])
 89              {
 90                  path[v1][2]+=path[st1.v][st1.mark];
 91              }
 92         }
 93     }
 94 }
 95
 96 int main()
 97 {
 98     int t;
 99     scanf("%d",&t);
100     while(t--)
101     {
102         scanf("%d%d",&n,&m);
103         inti();
104         for(int i=0; i<=n; i++) edges[i].clear();
105         for(int i=0; i<m; i++)
106         {
107             scanf("%d%d%d",&a,&b,&c);
108             edge m1; m1.v=b; m1.w=c;
109             edges[a].push_back(m1);
110         }
111         scanf("%d%d",&s1,&f);
112         dijkstra(s1,f);
113         if(dis[f][1]+1==dis[f][2])
114         {
115             printf("%d\n",path[f][1]+path[f][2]);
116         }
117         else
118             printf("%d\n",path[f][1]);
119     }
120     return 0;
121 }

View Code

转载于:https://www.cnblogs.com/fanminghui/p/3712202.html

hdu 1688 Sightseeing相关推荐

  1. 杭电OJ分类题目(4)-Graph

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(4) HDU Graph Theory - U ...

  2. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  3. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

  4. 一系列图论问题[转]

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  5. kk_想要学习的知识

    2018/4/27 计算几何 一.简介 计算几何属于ACM算法中比较冷门的分类,在省赛中只在前几年考察过,这两年还没有考过,而且和高精度计算一样,遇到题目主要靠套模板,因此对题意的理解至关重要,而且往 ...

  6. 图论练习题(存起来练)

    =============================以下是最小生成树+并查集======================================  [HDU]  1213 How Man ...

  7. ACM比赛经验、刷题记录及模板库总结(更新中)

    前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...

  8. 最短路径问题经典题目汇总

    50道数据结构最短路径问题 HDU 1142 http://acm.hdu.edu.cn/showproblem.php?pid=1142 HDU 1217 http://acm.hdu.edu.cn ...

  9. HDU题目分类大全【大集合】

    基础题: 1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029.  1032.1037.1040.1048.1056.105 ...

最新文章

  1. TCP与UDP区别小结
  2. 【转】使用Apache CXF开发WebServices服务端
  3. Caffe学习系列(22):caffe图形化操作工具digits运行实例
  4. spring boot中servlet启动原理
  5. php图片制作源码,php进行图片裁剪及生成缩略图程序源代码
  6. java 自动生成mybatis文件_如何自动生成Mybatis的Mapper文件详解
  7. iPhone 7 P适合什么系统?
  8. [转载]JAVA操作符
  9. CSV 文件打开乱码?如何批量解决 CSV 文件乱码问题
  10. 已解决-电脑端HP Scan扫描无反应无法扫描
  11. 20210327“泰迪杯数据挖掘大赛”csv模块使用记录
  12. win10无法装载重装系统iso文件_win10镜像不能安装系统如何解决_win10镜像无法安装处理方法...
  13. 斯皮尔曼相关系数范围_Spearman Rank(斯皮尔曼等级)相关系数及MATLAB实现
  14. 趋势性、季节性、周期性
  15. 【OpenCV】图片几何特征提取
  16. 回首过去 展望未来
  17. 用ado把excel数据写入oracle,如何将excel表格数据导入到oracle数据库对应的表中?!oracle导出excel文件...
  18. Python·@property属性
  19. Zabbix监控web基本配置
  20. np.log1p()取对数符合正态分布

热门文章

  1. Ubuntu 下编译ffmpeg和x264解编码器(翻译的一篇文章:)
  2. CodeSmith实用技巧(十四):使用Progress对象
  3. java random构造方法_Java中的Random()函数及两种构造方法
  4. 人工智能写的散文之白色月光下
  5. QQ第三方登录报错error=-1
  6. Unable to find remote helper for 'https'解决办法
  7. EMC virtual provisining and fast vp
  8. 基于数组的无锁队列(译)
  9. [转]PHP--优化PHP代码建议
  10. 你有没有成为技术作家的潜力