思路就是dijkstra找出最短路,dfs比较每一个最短路。

dijkstra可以找出每个点的前一个点, 所以dfs搜索比较的时候怎么处理携带和带走的数量就是关键,考虑到这个携带和带走和路径顺序有关,所以可以用下面的写法,看代码就可以了。

最开始的时候是想用一个偏动态规划的写法做,但是因为题目的显示,既要带去的车数量最少,又要求从一个点带走的车数量最少,所以如果过动规的话,对于一个点的多个最短路,就会选择带去数量最少,带走车数最少的路径,但是如果这个点后面的点的车辆数少一标准量的一半的话,前面带的是最少的,这样相当于携带的车的数量就多了,这样就矛盾了。

当时挺纠结的,因为只写过一道类型的题,还是用动规的写法写的,那个权值只有两个,也是pat的题,这个主要是权值矛盾了, 所以不能用动规的思想写。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=505;
  4. const int INF=0x3f3f3f3f;
  5. int g[maxn][maxn];
  6. vector<int> pre[maxn];
  7. int C,N,M,SP;
  8. int vis[maxn],num[maxn],d[maxn];
  9. void dijkstra()
  10. {
  11. d[0]=0;
  12. for (int i=0;i<N;i++) {
  13. int u=-1,tmp=INF;
  14. for (int j=0;j<=N;j++) {
  15. if (!vis[j]&&d[j]<tmp) {
  16. tmp=d[j];
  17. u=j;
  18. }
  19. }
  20. if (u==-1) break;
  21. vis[u]=1;
  22. for (int j=0;j<=N;j++) {
  23. if (j==u) {
  24. continue;
  25. }
  26. if (d[u]+g[u][j]<d[j]) {
  27. d[j]=d[u]+g[u][j];
  28. pre[j].clear();
  29. pre[j].push_back(u);
  30. }
  31. else if (d[u]+g[u][j]==d[j]) {
  32. pre[j].push_back(u);
  33. }
  34. }
  35. }
  36. }
  37. int path[maxn],acnt=0;
  38. int ansn=INF,anst=INF,ansp[maxn];
  39. void dfs(int u,int need,int take,int cnt)
  40. {
  41. path[cnt]=u;
  42. if (u==0) {
  43. // for (int i=0;i<cnt;i++) {
  44. // printf("%d ",path[i]);
  45. // }
  46. // puts("");
  47. // printf("need %d take %d\n",need,take);
  48. if (need<ansn) {
  49. ansn=need;
  50. anst=take;
  51. acnt=cnt;
  52. for (int i=0;i<cnt;i++) {
  53. ansp[i]=path[i];
  54. }
  55. }
  56. else if (need==ansn) {
  57. if (take<anst) {
  58. anst=take;
  59. acnt=cnt;
  60. for (int i=0;i<cnt;i++) {
  61. ansp[i]=path[i];
  62. }
  63. }
  64. }
  65. return ;
  66. }
  67. if (num[u]==C/2) {}
  68. else if (num[u]>C/2) {
  69. if (need>0) {
  70. if (num[u]-C/2>=need) {
  71. take+=num[u]-C/2-need;
  72. need=0;
  73. }
  74. else need-=num[u]-C/2;
  75. }
  76. else take+=num[u]-C/2;
  77. }
  78. else need+=C/2-num[u];
  79. int sz=pre[u].size();
  80. for (int i=0;i<sz;i++) {
  81. dfs(pre[u][i],need,take,cnt+1);
  82. }
  83. }
  84. int main()
  85. {
  86. // freopen("in.txt","r",stdin);
  87. scanf("%d%d%d%d",&C,&N,&SP,&M);
  88. for (int i=1;i<=N;i++) {
  89. scanf("%d",&num[i]);
  90. }
  91. memset(g,INF,sizeof(g));
  92. for (int i=0;i<=N;i++) {
  93. g[i][i]=0;
  94. d[i]=INF;
  95. }
  96. int u,v,c;
  97. for (int i=0;i<M;i++) {
  98. scanf("%d%d%d",&u,&v,&c);
  99. g[u][v]=c;
  100. g[v][u]=c;
  101. }
  102. dijkstra();
  103. // for (int i=1;i<=N;i++) {
  104. // printf("%d ",d[i]);
  105. // }
  106. // puts("");
  107. // for (int i=1;i<=N;i++) {
  108. // printf("%d:\n",i);
  109. // for (int j=0;j<pre[i].size();j++) {
  110. // printf("%d ",pre[i][j]);
  111. // }
  112. // printf("\n");
  113. // }
  114. dfs(SP,0,0,0);
  115. printf("%d %d",ansn,0);
  116. for (int i=acnt-1;i>=0;i--) {
  117. printf("->%d",ansp[i]);
  118. }
  119. printf(" %d\n",anst);
  120. return 0;
  121. }

1018 Public Bike Management (30分) (迪杰斯特拉+dfs)的更多相关文章

  1. 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 ...

  2. 1018 Public Bike Management (30 分)

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

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

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

  4. 1018 Public Bike Management (30分) PAT甲级真题 dijkstra + dfs

    前言: 本题是我在浏览了柳神的代码后,记下的一次半转载式笔记,不经感叹柳神的强大orz,这里给出柳神的题解地址:https://blog.csdn.net/liuchuo/article/detail ...

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

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

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

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

  7. 1018. Public Bike Management (30)

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

  8. 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 ...

  9. 1018 Public Bike Management (30) Dijkstra算法 + DFS

    题目及题解 https://blog.csdn.net/CV_Jason/article/details/81385228 迪杰斯特拉重新认识 两个核心的存储结构: int dis[n]: //记录每 ...

随机推荐

  1. Python 编辑注意点

    文本编辑 Python: 绝对不能用Word和Windows自带的记事本. (1)Word保存的不是纯文本文件 (2)记事本会自作聪明地在文件开始的地方加上几个特殊字符(UTF-8 BOM),结果会导 ...

  2. [HNOI2014] 道路堵塞 - 最短路,线段树

    对不起对不起,辣鸡蒟蒻又来用核弹打蚊子了 完全ignore了题目给出的最短路,手工搞出一个最短路,发现对答案没什么影响 所以干脆转化为经典问题:每次询问删掉一条边后的最短路 如果删掉的是非最短路边,那 ...

  3. 番外:如何克隆可刷新的PDB(Refreshable PDB)

    基于版本:19c (12.2.0.3) AskScuti 创建方法:克隆创建 对应路径:属于克隆.PDB类型为:Refreshable 相关系列请参考<Oracle创建PDB列表文章> 注 ...

  4. 初识Vue--生命周期

    初学Vue,写一些随记谨防忘记,不足之处谢谢指出!!! 本文可以直接复制自行创建一个HTML页面,查看结果. <!DOCTYPE html> <html lang="en& ...

  5. eclipse sql server 导出excel文件

    Jxl.jar 访问Excel的Jar包 注意:支持以.xls结尾的Excel文件,可能不支持.xlsx结尾的 下载地址: 程序所需要得包: 程序代码: package partice; import ...

  6. 常见运算符_python

    一.算数运算符a=2b=5c=8#加减乘除print(a+b,a-b,a*b,a/b)#取模,也就是余数print(b%a)#取整除print(b//a)#幂(次方)print(b**a) 二.比较运 ...

  7. 【C语言】用C语言输出“心形”图案

    在你们的世界里,是不是觉得程序猿一点浪漫都不懂?其实不是的,程序猿的世界也是很浪漫滴! 傻瓜版 int main() { printf("❤"); ; } 高级版 //版本一:单个 ...

  8. C语言是菜鸟和大神的分水岭

    作为一门古老的编程语言,C语言已经坚挺了好几十年了,初学者从C语言入门,大学将C语言视为基础课程.不管别人如何抨击,如何唱衰,C语言就是屹立不倒:Java.C#.Python.PHP.Perl 等都有 ...

  9. 每天进步一点点------Allegro 铺铜、内电层分割

    一.Allegro 铺铜 1.建议初学者内电层用正片,因为这样就不用考虑flash焊盘,这时候所有的过孔和通孔该连内电层的就连到内电层,不该连的就不连.而如果用负片,那么如果做焊盘的时候如果没有做fl ...

  10. [HDU5382]GCD?LCM!

    Description HDU5382 会吗?不会! 设\(F(n)=\sum\limits_{i = 1}^{n}\sum\limits_{j=1}^{n}[lcm(i,j)+gcd(i,j)\ge ...