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

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

分析:1、以终点 2 为起点 Dijkstra跑一边最短路,找到所有点到2的最短距离;
       2、直接DFS记忆化搜索。
注意:记忆化搜索时的return值,否则此很容易TLE
解法1:O(n^2)
#include<iostream>
#include<cstdio>
#include<cstring>
#define inf 0x7fffffff
int n,m,u,v,w;
using namespace std;
int g[][],dis[];
int vis[],path[];
void Dijkstra(int u)
{
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++)
dis[i]=g[u][i];
dis[u]=;
vis[u]=;
for(int i=;i<=n;i++){
int k,min=inf;
for(int j=;j<=n;j++){
if(!vis[j]&&min>dis[j]){
min=dis[j];
k=j;
}
}
vis[k]=;
for(int j=;j<=n;j++){
if(!vis[j]&&g[k][j]!=inf){//g[k][j]!=inf不能少
if(dis[j]>dis[k]+g[k][j])
dis[j]=dis[k]+g[k][j];
}
}
}
} int dfs(int u)
{
if(path[u]!=-) return path[u];
if(u==) return ;//记忆化搜索,如果该点已经访问过了,就返回从该点到终点的路径数
int num=;
for(int v=;v<=n;v++){
if(g[u][v]!=inf&&dis[v]<dis[u])
num+=dfs(v);
}
path[u]=num;//不能直接return num,否则会TLE
return path[u];
} int main()
{
while(scanf("%d",&n),n){
scanf("%d",&m);
memset(path,-,sizeof(path));
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
g[i][j]=(i==j?:inf);
}
for(int i=;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
if(g[u][v]>w)//处理重边
g[u][v]=g[v][u]=w;
}
Dijkstra();
cout<<dfs()<<endl;
}
return ;
}

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

#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#define inf 0x7fffffff
using namespace std;
struct Node
{
int u,d;
Node(long long uu,long long dd){
u=uu,d=dd;
}
friend bool operator < (Node a,Node b){
return a.d>b.d;
}
};
struct Edge
{
int v,w;
Edge(long long vv,long long ww){
v=vv,w=ww;
}
};
bool vis[];
long long path[];
vector<Edge> g[];//为Edge类型
priority_queue<Node>que;//为Node类型
long long dis[];
void Dijkstra()
{
dis[]=;
que.push(Node(,));
while(!que.empty()){
Node p=que.top();
que.pop();
long long u=p.u;
if(!vis[u]){
vis[u]=;//vis[u]=1位置不能放错
for(int i=;i<g[u].size();i++){
long long v=g[u][i].v;
long long c=g[u][i].w;
if(!vis[v]){//这里不能写vis[v]=1;
if(dis[v]>dis[u]+c){
dis[v]=dis[u]+c;
que.push(Node(v,dis[v]));
}
}
}
}
}
}
int dfs(int u)
{
if(path[u]!=-) return path[u];
if(u==) return ;//找到终点,返回1条路
long long num=;//注意num的位置
for(int i=;i<g[u].size();i++){
int v=g[u][i].v;
if(dis[v]<dis[u])
num+=dfs(v);
}
path[u]=num;
return path[u];//返回从u到终点的所有路径数
}
int main()
{
long long n,m,u,v,w;
while(scanf("%lld",&n),n){
scanf("%lld",&m);
memset(g,,sizeof(g));//切记清零
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++) dis[i]=inf;
for(int i=;i<=m;i++){
scanf("%lld%lld%lld",&u,&v,&w);
g[u].push_back(Edge(v,w));
g[v].push_back(Edge(u,w));
}
Dijkstra();
memset(path,-,sizeof(path));//初始化
printf("%lld\n",dfs());
}
}

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. Ubuntu的软件更新常识--添加软件源与ppa源

    加入ppa源的命令: sudo add-apt-repository ppa:user/ppa-name 删除ppa源的命令: sudo add-apt-repository -r ppa:user/ ...

  2. RabbitMQ组成及原理介绍-3

    rabbitmq作为成熟的企业消息中间件,实现了应用程序间接口调用的解耦,提高系统的吞吐量. 1.RabbitMQ组成 是由 LShift 提供的一个 Advanced Message Queuing ...

  3. Mac终端运行java程序

    1.编辑源文件HelloWorld.java 2.编译源文件 javac HelloWorld.java 生成HelloWorld.class文件 3.执行java字节码 注意,一定要到源目录下,并且 ...

  4. Huber-Markov先验模型相关

    随机概率重建-MAP算法 随机概率重建:利用贝叶斯理论作为框架,理想图像的先验知识作为约束条件进行图像重建.常用的随机概率超分辨率重建包括最大后验概率估计法(MAP)和极大似然估计法(ML). MAP ...

  5. 转:解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误

    操作SQL数据库,Python使用的是版本2.7,但是在运行的时候出现了异常错误UnicodeEncodeError:'ascii' codec can't encode characters in ...

  6. 三角剖分算法(delaunay)

    开篇 在做一个Low Poly的课题,而这种低多边形的成像效果在现在设计中越来越被喜欢,其中的低多边形都是由三角形组成的. 而如何自动生成这些看起来很特殊的三角形,就是本章要讨论的内容. 项目地址:  ...

  7. 部署mysql后,无法设置用户远程登陆(%只所有用户,不可以,只能给指定的ip?)

    MySQL允许远程访问的设置 1.注释bind-address = 127.0.0.1. 代码如下: >sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 将 ...

  8. windows 2003 发布遇到问题---分析器错误消息: 未能加载类型“YWPT.MvcApplication”。

    问题如下: “/”应用程序中的服务器错误. ------------------------------------------------------------------------------ ...

  9. Servlet与JSP九大内置对象的对应关系

    JSP对象 Servlet中怎样获得 out resp.getWriter request service方法中的req参数 response service方法中的resp参数 session re ...

  10. index封装

    就是求元素在父级当中的位置: 思路: <!DOCTYPE html> <html lang="en"> <head> <meta char ...