先找出可能在最短路上的边,图变成了一个DAG,然后在新图上DFS求答案就可以了。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<cstdio>
  6. #include<queue>
  7. #include<vector>
  8. using namespace std;
  9.  
  10. const int INF=0x7FFFFFFF;
  11. const int maxn=;
  12. int n,m,C1,C2,tot;
  13. int Cmax;
  14. int val[maxn];
  15. struct Edge
  16. {
  17. int u,v,L;
  18. }e[];
  19. int f[];
  20. vector<int>g[maxn];
  21. int dis[][maxn];
  22.  
  23. int ans[maxn],cnt;
  24. int sta[maxn];
  25.  
  26. int MIN1,MIN2;
  27.  
  28. void init()
  29. {
  30. MIN1=MIN2=INF;
  31. tot=;C1=;
  32. for(int i=;i<=;i++) g[i].clear();
  33. }
  34.  
  35. void add(int a,int b,int c)
  36. {
  37. e[tot].u=a,e[tot].v=b,e[tot].L=c;
  38. g[a].push_back(tot);
  39. tot++;
  40. }
  41.  
  42. void read()
  43. {
  44. scanf("%d%d%d%d",&Cmax,&n,&C2,&m);
  45. for(int i=;i<=n;i++) scanf("%d",&val[i]);
  46. for(int i=;i<=m;i++)
  47. {
  48. int u,v,L; scanf("%d%d%d",&u,&v,&L);
  49. add(u,v,L);
  50. add(v,u,L);
  51. }
  52. }
  53.  
  54. void SPFA(int f,int st)
  55. {
  56. for(int i=;i<=;i++) dis[f][i]=INF;
  57. dis[f][st]=;
  58. int flag[maxn]; memset(flag,,sizeof flag);
  59. queue<int>Q; Q.push(st); flag[st]=;
  60. while(!Q.empty())
  61. {
  62. int head= Q.front(); Q.pop(); flag[head]=;
  63. for(int i=;i<g[head].size();i++)
  64. {
  65. int id=g[head][i];
  66. if(dis[f][head]+e[id].L<dis[f][e[id].v])
  67. {
  68. dis[f][e[id].v]=dis[f][head]+e[id].L;
  69. if(flag[e[id].v]==)
  70. {
  71. Q.push(e[id].v);
  72. flag[e[id].v]=;
  73. }
  74. }
  75. }
  76. }
  77. }
  78.  
  79. void dfs(int x,int num1,int num2,int deep)
  80. {
  81. sta[deep]=x;
  82.  
  83. if(x==C2)
  84. {
  85. if(num2<MIN2)
  86. {
  87. MIN2=num2;
  88. MIN1=num1;
  89. for(int i=;i<=deep;i++) ans[i]=sta[i];
  90. tot=deep;
  91. }
  92.  
  93. else if(num2==MIN2&&num1<MIN1)
  94. {
  95. MIN2=num2;
  96. MIN1=num1;
  97. for(int i=;i<=deep;i++) ans[i]=sta[i];
  98. tot=deep;
  99. }
  100. return;
  101. }
  102.  
  103. for(int i=;i<g[x].size();i++)
  104. {
  105. if(f[g[x][i]]==) continue;
  106. int to=e[g[x][i]].v;
  107.  
  108. if(val[to]==Cmax/) dfs(to,num1,num2,deep+);
  109. else if(val[to]>Cmax/) dfs(to,num1+val[to]-Cmax/,num2,deep+);
  110. else if(val[to]<Cmax/)
  111. {
  112. if(num1>Cmax/-val[to]) dfs(to,num1+val[to]-Cmax/,num2,deep+);
  113. else dfs(to,,num2+Cmax/-val[to]-num1,deep+);
  114. }
  115. }
  116. }
  117.  
  118. void work()
  119. {
  120. int len=dis[][C2];
  121.  
  122. for(int i=;i<tot;i++)
  123. if(dis[][e[i].u]+e[i].L+dis[][e[i].v]==len)
  124. f[i]=;
  125.  
  126. dfs(,,,);
  127.  
  128. printf("%d ",MIN2);
  129. for(int i=;i<=tot;i++)
  130. {
  131. if(i<tot) printf("%d->",ans[i]);
  132. else printf("%d ",ans[i]);
  133. }
  134. printf("%d\n",MIN1);
  135. }
  136.  
  137. int main()
  138. {
  139. init();
  140. read();
  141. SPFA(,C1);
  142. SPFA(,C2);
  143. work();
  144. return ;
  145. }

PAT (Advanced Level) 1018. Public Bike Management (30)的更多相关文章

  1. PTA (Advanced Level) 1018 Public Bike Management

    Public Bike Management There is a public bike service in Hangzhou City which provides great convenie ...

  2. Pat(Advanced Level)Practice--1018(Public Bike Management)

    Pat1018代码 题目描写叙述: There is a public bike service in Hangzhou City which provides great convenience t ...

  3. 【PAT甲级】1018 Public Bike Management (30 分)(SPFA,DFS)

    题意: 输入四个正整数C,N,S,M(c<=100,n<=500),分别表示每个自行车站的最大容量,车站个数,此次行动的终点站以及接下来的M行输入即通路.接下来输入一行N个正整数表示每个自 ...

  4. PAT 甲级 1018 Public Bike Management (30 分)(dijstra+dfs,dfs记录路径,做了两天)

    1018 Public Bike Management (30 分)   There is a public bike service in Hangzhou City which provides ...

  5. PAT Advanced 1018 Public Bike Management (30) [Dijkstra算法 + DFS]

    题目 There is a public bike service in Hangzhou City which provides great convenience to the tourists ...

  6. 1018. Public Bike Management (30)

    时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue There is a public bike service i ...

  7. 1018 Public Bike Management (30)(30 分)

    时间限制400 ms 内存限制65536 kB 代码长度限制16000 B There is a public bike service in Hangzhou City which provides ...

  8. 1018 Public Bike Management (30 分)

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

  9. 1018 Public Bike Management (30分) 思路分析 + 满分代码

    题目 There is a public bike service in Hangzhou City which provides great convenience to the tourists ...

随机推荐

  1. ios小功能

    1.开 发过程中,我们通过http请求,后台返回json数据,而有时数据里某一字段的值为null-,然后我们把此值赋值给 NSArray,NSdictionary,或是NSString,然后我们会判断 ...

  2. JavaScript焦点事件、鼠标事件和滚轮事件使用详解

    网址:http://www.jb51.net/article/78094.htm

  3. 中文输入法不触发onkeyup事件的解决办法

    当监听一个input的keyup的事件的时候,英文输入法的情况下可以实时的通过keyup事件检测到文本框value的变化,但是当输入法变成中文后,input的keyup事件就不会被正常触发. 方法:o ...

  4. [转载] 关于Windows Boot Manager、Bootmgfw.efi、Bootx64.efi、bcdboot.exe 的详解

    原帖: http://bbs.wuyou.net/forum.php?mod=viewthread&tid=303679 前言:1.本教程针对于UEFI启动来叙述的,根据普遍的支持UEFI的机 ...

  5. Stu Website

    GIT: 分支的新建与合并 https://git-scm.com/book/zh/v2/Git-分支-分支的新建与合并 分支的管理 https://git-scm.com/book/zh/v1/Gi ...

  6. C#判断文字是否为汉字

    /// <summary> /// 检测一个字符串是不是以汉字开始 /// </summary> /// <param name="str">要 ...

  7. STM32F4系统时钟配置及描述

    STM32F4系统时钟配置及描述 stm32f407时钟配置方法(感觉很好,分享一下) STM32F4_RCC系统时钟配置及描述 STM32F4时钟设置分析 stm32f4 - 时钟树分析配置

  8. 非常简单的oracle和mysql数据互传

    工具是navicat,我用的是Navicat Premium 10: 这个工具可以同时连接mysql和oracle,如图: 同时连接上这两个库之后 工具->数据传输 左边是数据源,右边是导入目标 ...

  9. Debian 安装 vmware-tools 手记

    debian 8.5 源 deb http://ftp.de.debian.org/debian jessie main http://mirrors.163.com/.help/debian.htm ...

  10. C语言版的16进制与字符串互转函数

    http://www.cnblogs.com/nio-nio/p/3309367.html /* // C prototype : void StrToHex(BYTE *pbDest, BYTE * ...