本题的背景是求定点和定点之间的最短路问题(所有的最短路 不是一个解  是全部解,方法手段来自数据结构课程中的迪杰斯特拉算法和dfs(深度优先遍历)。

分别用两种方法编程如下代码

  • dfs
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. using namespace std;
  5. #define maxv 510
  6. bool visit[maxv];
  7.  
  8. int arc[maxv][maxv];//邻接矩阵
  9.  
  10. int M,N,C1,C2; //M总顶点数,N总边数,C1起点,C2终点
  11.  
  12. int vex[maxv]; //记录每个顶点的救援人数
  13.  
  14. int mind=0xfffffff,maxr=0,cnt;//mind最短路径,maxr最大救援人数,cnt最短路径条数
  15.  
  16. void dfs(int st,int end,int curPath,int curRes){
  17. if (st==end){
  18. if (curPath<mind){
  19. cnt=1;
  20. mind=curPath;
  21. maxr=curRes;
  22. }else if(curPath==mind){
  23. cnt++;
  24. if (curRes>maxr)
  25. maxr=curRes;
  26. }
  27. return;
  28. }
  29. else{
  30. for (int k=0;k<M;k++){
  31. if (arc[st][k]!=0&&!visit[k]){
  32. visit[k]=1;
  33. dfs(k,end,curPath+arc[st][k],curRes+vex[k]);
  34. visit[k]=0;
  35. }
  36. }
  37. return ;
  38. }
  39. }
  40. int main(){
  41. while(scanf("%d%d%d%d",&M,&N,&C1,&C2)!=EOF){
  42. memset(arc,0,sizeof(arc));
  43. for(int i=0;i<M;i++)
  44. scanf("%d",&vex[i]);
  45. int i,j,d;
  46. for(int k=0;k<N;k++){
  47. scanf("%d%d%d",&i,&j,&d);
  48. arc[j][i]=arc[i][j]=d;
  49. }
  50. memset(visit,0,sizeof(visit));
  51. visit[C1]=1;
  52. dfs(C1,C2,0,vex[C1]);
  53. printf("%d %d",cnt,maxr);
  54. }
  55. return 0;
  56. }
  1. 容易放的错误是mind,maxr忘记赋初始值    
  2. 矩阵scanf输入的时候&arg[i][j]  不会报错  但会导致输入异常   这个问题我也很奇怪  先在这里记录说明了
  •   迪杰斯特拉算法
  1. #include <iostream>
  2. #include <cstdio>
  3. using namespace std;
  4. #define maxv 510
  5. #define inf 65536
  6.  
  7. int arc[maxv][maxv];//邻接矩阵
  8.  
  9. int M,N,C1,C2; //M总顶点数,N总边数,C1起点,C2终点
  10.  
  11. int vex[maxv]; //记录每个顶点的救援人数
  12.  
  13. int maxr=0,cnt;//mind最短路径,maxr最大救援人数,cnt最短路径条数
  14.  
  15. int Path[maxv],D[maxv],S[maxv];
  16. //Path[]记录从源点v0到终点vi的直接前驱顶点序号
  17. //D[]记录从源点v0到终点vi的当前最短路径长度
  18. //S[]记录从源点v0到源点vi是否已经被确定最短路径长度
  19.  
  20. /*计算v0到j的当前最大救援人数*/
  21. void compute(int v0,int j){
  22. int curRes=vex[v0];
  23. for (int k=j;k!=v0;k=Path[k]){
  24. curRes+=vex[k];
  25. }
  26. if (curRes>maxr)
  27. maxr=curRes;
  28. return;
  29. }
  30.  
  31. void dijistra(int v0,int v){
  32. int mind,w;
  33. //mind最短路径 w被加入到S中的顶点序号
  34.  
  35. int curRes=0;
  36. /*初始化*/
  37. for (int i=0;i<M;i++){
  38. S[i]=false;
  39. D[i]=arc[v0][i];
  40. if (D[i]<inf)
  41. Path[i]=v0;
  42. else
  43. Path[i]=-1;
  44. }
  45. cnt=1;
  46. compute(v0,v);
  47. S[v0]=true;
  48. D[v0]=0;
  49.  
  50. /*v0到其他M-1个顶点的最短路径*/
  51. for (int i=1;i<M;i++){
  52. mind=inf;
  53. for (int j=0;j<M;j++)
  54. if (!S[j]&&D[j]<mind){
  55. w=j;mind=D[j];
  56. }
  57. S[w]=true;
  58. for (int j=0;j<M;j++)
  59. if (!S[j]&&(D[w]+arc[w][j]<D[j])){
  60. D[j]=D[w]+arc[w][j];
  61. Path[j]=w;
  62. if (j==v){
  63. cnt=1;
  64. maxr=0;
  65. compute(v0,j);
  66. }
  67. }else if (!S[j]&&D[w]+arc[w][j]==D[j]){
  68. Path[j]=w;
  69. if (j==v){
  70. cnt++;/*v0到顶点j的当前最短路径不止一条*/
  71. compute(v0,j);
  72. }
  73. }
  74. }
  75. return;
  76. }
  77. int main(){
  78. while(scanf("%d%d%d%d",&M,&N,&C1,&C2)!=EOF){
  79. for (int i=0;i<M;i++)
  80. for (int j=0;j<M;j++)
  81. arc[i][j]=inf;
  82. for(int i=0;i<M;i++)
  83. scanf("%d",&vex[i]);
  84. int i,j,d;
  85. for(int k=0;k<N;k++){
  86. scanf("%d%d%d",&i,&j,&d);
  87. arc[j][i]=arc[i][j]=d;
  88. }
  89. dijistra(C1,C2);
  90. printf("%d %d\n",cnt,maxr);
  91. //printf("%d %d %d %d %d\n",cnt,maxr,D[C2],Path[C2],Path[Path[C2]]);
  92. /*for (int i=0;i<M;i++){
  93. for (int j=0;j<M;j++)
  94. printf("%d ",arc[i][j]);
  95. printf("\n");
  96. }*/
  97. }
  98. return 0;
  99. }

  这段代码目前只能通过pat平台的三个测试样例  得 16分   后续会 改bug

pat1003 迪杰斯特拉法和dfs求最短路的更多相关文章

  1. 算法基础⑧搜索与图论--dijkstra(迪杰斯特拉)算法求单源汇最短路的最短路径

    单源最短路 所有边权都是正数 朴素Dijkstra算法(稠密图) #include<cstdio> #include<cstring> #include<iostream ...

  2. 迪杰斯特拉(Dijkstra) 最短路算法

    直接看B站视频吧: https://www.bilibili.com/video/BV1QK411V7V4/

  3. ACM-ICPC 2018 南京赛区网络预赛 - L Magical Girl Haze (分层迪杰斯特拉)

    题意:N个点,M条带权有向边,求可以免费K条边权值的情况下,从点1到点N的最短路. 分析:K<=10,用dist[i][j]表示从源点出发到点i,免费j条边的最小花费.在迪杰斯特拉的dfs过程中 ...

  4. POJ 2502 Subway(迪杰斯特拉)

    Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6692   Accepted: 2177 Descriptio ...

  5. 单源最短路径-迪杰斯特拉算法(Dijkstra's algorithm)

    Dijkstra's algorithm 迪杰斯特拉算法是目前已知的解决单源最短路径问题的最快算法. 单源(single source)最短路径,就是从一个源点出发,考察它到任意顶点所经过的边的权重之 ...

  6. PAT 1087 All Roads Lead to Rome[图论][迪杰斯特拉+dfs]

    1087 All Roads Lead to Rome (30)(30 分) Indeed there are many different tourist routes from our city ...

  7. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

  8. hdu 1595 find the longest of the shortest(迪杰斯特拉,减去一条边,求最大最短路)

    find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  9. hdu 1142(迪杰斯特拉+记忆化搜索)

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

随机推荐

  1. 2018-2019-2 20165336 《网络对抗技术》 Exp6 信息搜集与漏洞扫描

    2018-2019-2 20165336 <网络对抗技术> Exp6 信息搜集与漏洞扫描 一.原理与实践说明 1.实践内容 本实践的目标是掌握信息搜集的最基础技能.具体有: 各种搜索技巧的 ...

  2. DetNet: A Backbone network for Object Detection 笔记

    1 前言 主要贡献: (1)第一个分析微调传统ImageNet预训练模型应用于目标检测器的固有缺点 (2)提出一个名为DetNet的新的骨干结构,它通过保持空间分辨率和扩大感受野的方式来专门设计用于目 ...

  3. python集合set相关操作

    定义: 1.不同元素组成 2.无序 3.集合中的元素必须是不可变类型 创建集合 1 s = {1,2,3,4,5,6,7,8} 1.定义可变集合 1 2 3 >>> set_test ...

  4. 《linux就该这么学》第十七节课:第18,19,23章,mariadb数据库、PXE无人值守安装系统和openldap目录服务。

    第23章 (借鉴请改动) openldap数据的特点:1.短小.2.读取次数较多 上述说明: openLDAP服务端配置:     1.yum install -y openldap openldap ...

  5. python数据类型之列表类型

    一.列表 作用:多个装备,多个爱好,多门课程,多个女朋友等 定义:[]内可以有多个任意类型的值,逗号分隔 以下是列表的常用操作方法: append(), count(), insert(),rever ...

  6. 自定义Win10右键“发送到”菜单

    打开Win10文件资源管理器窗口(打开“这台电脑”或任一文件夹即可),然后在资源管理器窗口的地址栏中输入 shell:sendto ,回车或点击地址栏右侧的“转到”箭头即可打开“SendTo(发送到) ...

  7. 学Python的感受

    这门课程已经上了两周了,虽然还没学到什么实质上的东西,只是做了几道题,但是我也感受到了Python的魅力.我感觉这门课真的很有用,比如老师所说的网络爬虫,我对这个非常感兴趣.再说说老师的教学方式,理论 ...

  8. arm浮点运算

    首先总结一下计算机中的浮点数的存储. 浮点数的标准是IEEE-754,规定了浮点数的存储都是通过科学计算法来存储的,n2-e的表示. 浮点数首先分为,定浮点(fixed-point)和浮点(float ...

  9. linux目录详细列表

    详细列表 目录 说明 备注 bin 存放普通用户可执行的指令 即使在单用户模式下也能够执行处理 boot 开机引导目录 包括Linux内核文件与开机所需要的文件 dev 设备目录 所有的硬件设备及周边 ...

  10. Qt3D Shader

    --------------------------------------------------- Qt3D ShaderPrograme Qt3D GLSL 渲染器 Shader示例可参考: h ...