http://pat.zju.edu.cn/contests/pat-a-practise/1018

在杭州各个点,有很多自助自行车的点,最大容纳点为CMAX,但比较适合的情况是CMAX/2,

现在从起点到终点,在最短路的情况下,调整各个车站的自行车数量使之CMAX/2,问开始时要提供的自行车最少与最后剩余的自行车最少的路径

最短路+DFS

在DFS时加上一个剪枝 if(lenth>dis[first])return ;就可以通过所有点

  1. #include<stdio.h>
  2. #define MAX 0x3ffffff
  3. int cmax,N,end,M;
  4. int node[];
  5. int map[][];
  6. int path[];
  7.  
  8. int rpath[];
  9. int in,out,nowstep,rstep;
  10.  
  11. bool hash[][];
  12. int shortlen;
  13.  
  14. int dis[];
  15. bool use[];
  16. int ok=;
  17.  
  18. void dijk( )
  19. {
  20. int n=N,m;
  21. int min,rj,i,j;
  22. for(j=;j<=n;j++)
  23. {
  24. dis[j]=map[][j];
  25. use[j]=;
  26. }
  27. use[]=;
  28. for(i=;i<n;i++)
  29. {
  30. min=MAX;
  31. for(j=;j<=n;j++)
  32. {
  33. if(use[j]==)continue;
  34. if(dis[j]<min)
  35. {
  36. min=dis[j];
  37. rj=j;
  38. }
  39. }
  40.  
  41. use[rj]=;
  42. for(j=;j<=n;j++)
  43. {
  44. if(use[j]==)continue;
  45. if(dis[j]>dis[rj]+map[rj][j])
  46. dis[j]=dis[rj]+map[rj][j];
  47. }
  48. }
  49.  
  50. shortlen=dis[end];
  51. }
  52.  
  53. void print(){
  54. int i;
  55. printf("%d",in);
  56. printf("");
  57. for(i=;i<=rstep;i++){
  58. printf("->%d",rpath[i]);
  59. }
  60. printf(" %d\n",out);
  61. }
  62.  
  63. void cal(){
  64. int tin=,tout=;
  65. int i,add=;
  66. for(i=;i<=nowstep;i++){
  67. add+=node[path[i]]-cmax/;
  68. if(add<tin)tin=add;
  69. }
  70. if(tin>)tin=;
  71. else tin=-tin;
  72. tout=add+tin;
  73.  
  74. if((tin<in)||((tin==in)&&tout<out)){
  75. in=tin;
  76. out=tout;
  77. if(in==&&tout==)ok=;
  78. rstep=nowstep;
  79. for(i=;i<=nowstep;i++){
  80. rpath[i]=path[i];
  81. }
  82. }
  83.  
  84. //test
  85. /*
  86. printf("%d",tin);
  87. printf(" 0");
  88. for(i=1;i<=nowstep;i++){
  89. printf("->%d",path[i]);
  90. }
  91. printf(" %d\n",tout);
  92. */
  93. }
  94. void dfs(int step,int first,int lenth)
  95. {
  96. if(ok==||lenth>dis[first])return ; //lenth>dis[first] 是个关键的剪枝,不加的话最后一个点会超时
  97. if(lenth==shortlen&&first==end){
  98. nowstep=step;
  99. cal();
  100. }
  101.  
  102. int j;
  103. for(j=;j<=N;j++){
  104. if(hash[first][j]==||map[j][first]==MAX)continue;
  105. hash[first][j]=hash[j][first]=;
  106. path[step+]=j;
  107. dfs(step+,j,lenth+map[first][j]);
  108. hash[first][j]=hash[j][first]=;
  109. }
  110. }
  111.  
  112. int main()
  113. {
  114. while(scanf("%d%d%d%d",&cmax,&N,&end,&M)!=EOF){
  115. int i,j,temp;
  116. ok=;
  117. in=;
  118. out=;
  119.  
  120. for(i=;i<=N;i++){
  121. for(j=;j<=N;j++){
  122. map[i][j]=MAX;
  123. hash[i][j]=;
  124. }
  125. }
  126.  
  127. for(i=;i<=N;i++){
  128. scanf("%d",&node[i]);
  129. }
  130.  
  131. int ll,rr,v;
  132. for(i=;i<=M;i++){
  133. scanf("%d%d%d",&ll,&rr,&v);
  134. map[ll][rr]=map[rr][ll]=v;
  135. }
  136. dijk();
  137. dfs(,,);
  138. print();
  139. }
  140.  
  141. return ;
  142. }

PAT1018——最短路加DFS的更多相关文章

  1. NOIP 2013 货车运输 最大生成树加DFS巧妙AC

    #include<set> #include<map> #include<cmath> #include<queue> #include<stac ...

  2. HDU(1572),最短路,DFS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1572 很久没写深搜了,有点忘了. #include <iostream> #include ...

  3. poj3160强连通分量加dfs

    After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ends such ...

  4. Treasure Hunt--poj1066(最短路加判断线段的关系)

    http://poj.org/problem?id=1066 题目大意:有n条线段 他们都在这个房间里   最后有一个点代表起始位置 现在想通过墙出去  他只能爆破每个房间的中点的门   问最少的门通 ...

  5. Labyrinth 树的直径加DFS

    The northern part of the Pyramid contains a very large and complicated labyrinth. The labyrinth is d ...

  6. HDU - 2066 最短路+加一个节点

    一个图上,有M条边,Z个出发点,Y个终止点.求一条最短路,其中起点是Z中的任意一点,终点是Y中任意一点. Input 输入数据有多组,输入直到文件结束. 每组的第一行是三个整数M,Z,Y 接着有M行, ...

  7. nyoj 203 三国志(最短路加01背包)

    三国志 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 <三国志>是一款很经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.现在他把游戏简化一下, ...

  8. zoj 2110 很好的dfs+奇偶剪枝

    //我刚开始竟然用bfs做,不断的wa,bfs是用来求最短路的而这道题是求固定时间的 //剪纸奇偶剪枝加dfs #include<stdio.h> #include<queue> ...

  9. hdu 6852Path6(最短路+最小割)

    传送门 •题意 有n个城市,标号1-n 现花费最小的代价堵路 使得从1号城市到n号城市的路径边长 (注意只是变长不是最长) 堵一条路的代价是这条路的权值 •思路 在堵路以前,从1到n的最小路径当然是最 ...

随机推荐

  1. LAMP服务器的搭建

    LAMP是一组构建Web应用平台的开源软件解决方案,它是一个开源套件组合.其中L:linux,A :Apache HTTP服务器,M : MySQL或MariaDB,P : perl或Python.这 ...

  2. 一篇文章学会spark-streaming

    版权申明:转载请注明出处.文章来源:bigdataer.net 1.什么是spark-streaming? 实际生产中会有许多应用到实时处理的场景,比如:实时监测页面点击,实时监测系统异常,实时监测来 ...

  3. Gamma函数相关matlab代码

    1.Gamma函数: Gamma函数matlab代码: x=:0.5:5syms t y=)*exp(-t),,inf) y=double(y) plot(x,y,) 图像如下: 2.lgΓ(x)函数 ...

  4. angular2.x 多选框事件

    angular2.x - 4.x  的多选框事件 ng2 -- ng4 反正都是用es6 都统称为2.x吧. 下面贴代码 html界面 <div class="row"> ...

  5. Firefox 下载、附加组件、Flash插件、缓存位置(附加Chrome下载和Opera下载)

    Firefox 下载的FTP页面: http://ftp.mozilla.org/pub/firefox/releases/ Firefox下载官方页面: https://www.mozilla.or ...

  6. 个人作业4——alpha阶段个人小结

    一.个人总结 在alpha 结束之后, 每位同学写一篇个人博客, 总结自己的alpha 过程: 请用自我评价表:http://www.cnblogs.com/xinz/p/3852177.html 有 ...

  7. docker建立和共享文件(服务器和docker之间的共享)

    建立序列号:sudo docker run -it domimiek/deep-base  /bin/bash   回撤后会出现一个序列号(记住) 开始:sudo docker start 序列号 当 ...

  8. WinForm 创建与读写配置文件

    (转自:http://www.cnblogs.com/SkySoot/archive/2012/02/08/2342941.html) 1. 创建 app.config 文件: 右击项目名称,选择“添 ...

  9. 【转】Hibernate 原汁原味的四种抓取策略

    最近在研究 Hibernate 的性能优化的时候碰到了"抓取策略", 由于以前没有详细的研究过, 所以到处找资料, 但是无论从一些讲 Hibernate 书籍,还是他人 Blog ...

  10. .Net 中的IL中间语言基本语法

    一.前言 IL是什么? Intermediate Language (IL)微软中间语言 C#代码编译过程? C#源代码通过LC转为IL代码,IL主要包含一些元数据和中间语言指令: JIT编译器把IL ...