题意:看样子很多人都把这题目看错了,以为是求最短路的条数。真正的意思是:假设 A和B 是相连的,当前在 A 处,

如果 A 到终点的最短距离大于 B 到终点的最短距离,则可以从 A 通往 B 处,问满足这种的条件的从办公室到家的路径条数。

分析:1、以终点 2 为起点 Dijkstra跑一边最短路,找到所有点到2的最短距离;
       2、直接DFS记忆化搜索。
注意:记忆化搜索时的return值,否则此很容易TLE
解法1:O(n^2)
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define inf 0x7fffffff
  5. int n,m,u,v,w;
  6. using namespace std;
  7. int g[][],dis[];
  8. int vis[],path[];
  9. void Dijkstra(int u)
  10. {
  11. memset(vis,,sizeof(vis));
  12. for(int i=;i<=n;i++)
  13. dis[i]=g[u][i];
  14. dis[u]=;
  15. vis[u]=;
  16. for(int i=;i<=n;i++){
  17. int k,min=inf;
  18. for(int j=;j<=n;j++){
  19. if(!vis[j]&&min>dis[j]){
  20. min=dis[j];
  21. k=j;
  22. }
  23. }
  24. vis[k]=;
  25. for(int j=;j<=n;j++){
  26. if(!vis[j]&&g[k][j]!=inf){//g[k][j]!=inf不能少
  27. if(dis[j]>dis[k]+g[k][j])
  28. dis[j]=dis[k]+g[k][j];
  29. }
  30. }
  31. }
  32. }
  33.  
  34. int dfs(int u)
  35. {
  36. if(path[u]!=-) return path[u];
  37. if(u==) return ;//记忆化搜索,如果该点已经访问过了,就返回从该点到终点的路径数
  38. int num=;
  39. for(int v=;v<=n;v++){
  40. if(g[u][v]!=inf&&dis[v]<dis[u])
  41. num+=dfs(v);
  42. }
  43. path[u]=num;//不能直接return num,否则会TLE
  44. return path[u];
  45. }
  46.  
  47. int main()
  48. {
  49. while(scanf("%d",&n),n){
  50. scanf("%d",&m);
  51. memset(path,-,sizeof(path));
  52. for(int i=;i<=n;i++){
  53. for(int j=;j<=n;j++)
  54. g[i][j]=(i==j?:inf);
  55. }
  56. for(int i=;i<=m;i++){
  57. scanf("%d%d%d",&u,&v,&w);
  58. if(g[u][v]>w)//处理重边
  59. g[u][v]=g[v][u]=w;
  60. }
  61. Dijkstra();
  62. cout<<dfs()<<endl;
  63. }
  64. return ;
  65. }

解法2:刚开始dfs中TLE,修改后就一直WA...至今缘由不明,还是太菜了

  1. #include<queue>
  2. #include<cstdio>
  3. #include<vector>
  4. #include<cstring>
  5. #define inf 0x7fffffff
  6. using namespace std;
  7. struct Node
  8. {
  9. int u,d;
  10. Node(long long uu,long long dd){
  11. u=uu,d=dd;
  12. }
  13. friend bool operator < (Node a,Node b){
  14. return a.d>b.d;
  15. }
  16. };
  17. struct Edge
  18. {
  19. int v,w;
  20. Edge(long long vv,long long ww){
  21. v=vv,w=ww;
  22. }
  23. };
  24. bool vis[];
  25. long long path[];
  26. vector<Edge> g[];//为Edge类型
  27. priority_queue<Node>que;//为Node类型
  28. long long dis[];
  29. void Dijkstra()
  30. {
  31. dis[]=;
  32. que.push(Node(,));
  33. while(!que.empty()){
  34. Node p=que.top();
  35. que.pop();
  36. long long u=p.u;
  37. if(!vis[u]){
  38. vis[u]=;//vis[u]=1位置不能放错
  39. for(int i=;i<g[u].size();i++){
  40. long long v=g[u][i].v;
  41. long long c=g[u][i].w;
  42. if(!vis[v]){//这里不能写vis[v]=1;
  43. if(dis[v]>dis[u]+c){
  44. dis[v]=dis[u]+c;
  45. que.push(Node(v,dis[v]));
  46. }
  47. }
  48. }
  49. }
  50. }
  51. }
  52. int dfs(int u)
  53. {
  54. if(path[u]!=-) return path[u];
  55. if(u==) return ;//找到终点,返回1条路
  56. long long num=;//注意num的位置
  57. for(int i=;i<g[u].size();i++){
  58. int v=g[u][i].v;
  59. if(dis[v]<dis[u])
  60. num+=dfs(v);
  61. }
  62. path[u]=num;
  63. return path[u];//返回从u到终点的所有路径数
  64. }
  65. int main()
  66. {
  67. long long n,m,u,v,w;
  68. while(scanf("%lld",&n),n){
  69. scanf("%lld",&m);
  70. memset(g,,sizeof(g));//切记清零
  71. memset(vis,,sizeof(vis));
  72. for(int i=;i<=n;i++) dis[i]=inf;
  73. for(int i=;i<=m;i++){
  74. scanf("%lld%lld%lld",&u,&v,&w);
  75. g[u].push_back(Edge(v,w));
  76. g[v].push_back(Edge(u,w));
  77. }
  78. Dijkstra();
  79. memset(path,-,sizeof(path));//初始化
  80. printf("%lld\n",dfs());
  81. }
  82. }

HDU 1142 A Walk Through the Forest(Dijkstra+记忆化搜索)的更多相关文章

  1. HDU 1142 A Walk Through the Forest(dijkstra+记忆化DFS)

    题意: 给你一个图,找最短路.但是有个非一般的的条件:如果a,b之间有路,且你选择要走这条路,那么必须保证a到终点的所有路都小于b到终点的一条路.问满足这样的路径条数 有多少,噶呜~~题意是搜了解题报 ...

  2. 题解报告:hdu 1142 A Walk Through the Forest

    题目链接:acm.hdu.edu.cn/showproblem.php?pid=1142 Problem Description Jimmy experiences a lot of stress a ...

  3. HDU1142 (Dijkstra+记忆化搜索)

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

  4. HDU 1142 A Walk Through the Forest (记忆化搜索 最短路)

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

  5. HDU 1142 A Walk Through the Forest(最短路+记忆化搜索)

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

  6. HDU 4444 Walk (离散化建图+BFS+记忆化搜索) 绝对经典

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4444 题意:给你一些n个矩形,给你一个起点,一个终点,要你求从起点到终点最少需要转多少个弯 题解:因为 ...

  7. luogu3953 [NOIp2017]逛公园 (tarjan+dijkstra+记忆化搜索)

    先跑一边dijkstra算出从1到i的最短距离dis[i] 然后建反向边 从n开始记忆化搜索,(p,k)表示1到p的距离=dis[p]+k的方案数 答案就是$\sum\limits_{i=0}^{k} ...

  8. HDU 1142 A Walk Through the Forest (求最短路条数)

    A Walk Through the Forest 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1142 Description Jimmy exp ...

  9. hdu 1142 A Walk Through the Forest (最短路径)

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

随机推荐

  1. debugging openstack with pdb

    在要开始debug的地方导入pdb: class KeypairAPI(base.Base): """Sub-set of the Compute Manager API ...

  2. 表达式树在LINQ动态查询

    动态构建表达式树,最佳实践版,很实用! public class FilterCollection : Collection<IList<Filter>> { public F ...

  3. stringstream类操作字符串流

     C++ Code  12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...

  4. DM8168 OpenCV尝试与评估(编译ARM版OpenCV)

     交叉编译opencv2.3.1,并在DM8168 cortex A8中执行图像处理. 开发环境: PC:ubuntu12.04LTS.Intel Core 2 Duo CPU  E7200@2. ...

  5. Android popupwindow 演示样例程序一

    经过多番測试实践,实现了popupwindow 弹出在指定控件的下方.代码上有凝视.有须要注意的地方.popupwindow 有自已的布局,里面控件的监听实现都有.接下来看代码实现. 项目资源下载:点 ...

  6. linux命令之rpm

    1.查询一个包是否被安装的命令rpm -q  < rpm package name> 2.列出所有被安装的rpm package 命令rpm -qa

  7. Spring学习笔记--使用Spring基于Java的配置

    我们需要使用@Component注解来定义一个配置类,在配置类中我们定义Bean: package com.moonlit.myspring; import org.springframework.c ...

  8. log4j2设置日志文件读写权限(filePermissions)

    spring-boot使用log4j2作为日志插件的时候需要设置日志文件的读写权限,可以File 上增加filePermissions,如: <File name="File" ...

  9. Excel宏被禁用解决办法

  10. Objective-C代码学习大纲(4)

    2011-05-11 14:06 佚名 otierney 字号:T | T 本文为台湾出版的<Objective-C学习大纲>的翻译文档,系统介绍了Objective-C代码,很多名词为台 ...