A Walk Through the Forest

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5679    Accepted Submission(s): 2086

Problem Description
Jimmy experiences a lot of stress at work these days, especially since his accident made working difficult. To relax after a hard day, he likes to walk home. To make things even nicer, his office is on one side of a forest, and his house is on the other. A nice walk through the forest, seeing the birds and chipmunks is quite enjoyable. 
The forest is beautiful, and Jimmy wants to take a different route everyday. He also wants to get home before dark, so he always takes a path to make progress towards his house. He considers taking a path from A to B to be progress if there exists a route from B to his home that is shorter than any possible route from A. Calculate how many different routes through the forest Jimmy might take. 
 
Input
Input contains several test cases followed by a line containing 0. Jimmy has numbered each intersection or joining of paths starting with 1. His office is numbered 1, and his house is numbered 2. The first line of each test case gives the number of intersections N, 1 < N ≤ 1000, and the number of paths M. The following M lines each contain a pair of intersections a b and an integer distance 1 ≤ d ≤ 1000000 indicating a path of length d between intersection a and a different intersection b. Jimmy may walk a path any direction he chooses. There is at most one path between any pair of intersections. 
 
Output
For each test case, output a single integer indicating the number of different routes through the forest. You may assume that this number does not exceed 2147483647
 
Sample Input
5 6
1 3 2
1 4 2
3 4 3
1 5 12
4 2 34
5 2 24
7 8
1 3 1
1 4 1
3 7 1
7 4 1
7 5 1
6 7 1
5 2 1
6 2 1
0
 
 
Sample Output
2
4
 
Source
 
这道题的大意为: 
                    这道题不同于以前简单的最短路径,它要求的是:如果A到B的过程中, 假如存在一个B点到家终点(2号点)的路径比所有A到家终点的路径要短。
                   即 distance[B][2]>distance[A][2];   那么A->B->2的路径算一条,计算这样的路径的条数.........
 对于这道题,我们其实可以这样思考
                                          我们不妨先算出。2号点到所有点的最短距离,然后再来优先搜索所有满足这样的条件的个数即为它的路径的个数.....
 
代码:
 #include<cstdio>
#include<cstring>
using namespace std;
const int inf =0x3f3f3f3f;
const int maxn =1005;
bool vis[maxn];
int lowc[maxn],map[maxn][maxn];
int roadnum[maxn];
void Dijkstra(int st,int n)
{
int minx;
memset(vis,0,sizeof(vis));
vis[st]=0;
for(int i=1;i<=n;i++){
lowc[i]=map[st][i];
}
lowc[st]=0;
int pre=st;
for(int i=1;i<n;i++){
minx=inf;
for(int j=1;j<=n;j++){
if(!vis[j]&&lowc[pre]+map[pre][j]<lowc[j]){
lowc[j]=lowc[pre]+map[pre][j];
} }
for(int j=1;j<=n;j++){
if(!vis[j]&&minx>lowc[j]){
minx=lowc[j];
pre=j;
}
}
vis[pre]=true;
}
} /*记忆化搜索dfs*/
int Dfs(int st,int n){ if(st==2) return 1;
else if(roadnum[st]) return roadnum[st] ; //如果已经计算出来了就直接返回的路径条数
int sum=0;
for(int i=1;i<=n;i++){
if(map[st][i]!=inf&&lowc[st]>lowc[i])
sum+=Dfs(i,n);
}
roadnum[st]+=sum;
return roadnum[st];
}
void init(int n)
{
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
map[i][j]=map[j][i]=inf;
}
}
}
int main()
{
int n,m;
int x,y,val;
while(scanf("%d",&n)!=EOF&&n!=0){
scanf("%d",&m);
init(n);
memset(roadnum,0,sizeof(roadnum));
while(m--){
scanf("%d%d%d",&x,&y,&val);
if(map[y][x]>val)
map[y][x]=map[x][y]=val;
}
Dijkstra(2,n);
printf("%d\n",Dfs(1,n));
}
return 0;
}

hduoj----1142A Walk Through the Forest(记忆化搜索+最短路)的更多相关文章

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

  2. HDU - 5001 Walk(概率dp+记忆化搜索)

    Walk I used to think I could be anything, but now I know that I couldn't do anything. So I started t ...

  3. NOIP 2017 逛公园 记忆化搜索 最短路 好题

    题目描述: 策策同学特别喜欢逛公园.公园可以看成一张N个点MM条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. ...

  4. UVA - 10917 - Walk Through the Forest(最短路+记忆化搜索)

    Problem    UVA - 10917 - Walk Through the Forest Time Limit: 3000 mSec Problem Description Jimmy exp ...

  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 1142 A Walk Through the Forest(SPFA+记忆化搜索DFS)

    题目链接 题意 :办公室编号为1,家编号为2,问从办公室到家有多少条路径,当然路径要短,从A走到B的条件是,A到家比B到家要远,所以可以从A走向B . 思路 : 先以终点为起点求最短路,然后记忆化搜索 ...

  7. HDU 1142 A Walk Through the Forest(Dijkstra+记忆化搜索)

    题意:看样子很多人都把这题目看错了,以为是求最短路的条数.真正的意思是:假设 A和B 是相连的,当前在 A 处, 如果 A 到终点的最短距离大于 B 到终点的最短距离,则可以从 A 通往 B 处,问满 ...

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

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

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

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

随机推荐

  1. ubuntu下phpstorm无法输入中文的解决办法

    http://blog.csdn.net/woshiliulei0/article/details/51657356 今天期待已久的搜狗输入法linux版上线了,对于我们这种之前用习惯了搜狗输入法的屌 ...

  2. BeagleBone Black– 智能家居控制系统 LAS - ESP8266 UDP 服务

    NodeMCU 的文档里面终于发现,ESP8266 的GPIO 2 确实是 PIN 4,GPIO 0 是 PIN 3. https://github.com/nodemcu/nodemcu-firmw ...

  3. linux挂载共享文件夹

    挂载windows共享目录或FTP: 方式一:包含密码 Shell代码 收藏代码 sudo mount //192.168.10.22/FTPServer /windows -o username=u ...

  4. Struts2配置详解_配置Action

    Struts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2.Action接口,并实现 ...

  5. 读写分离提高 SQL Server 并发性能

    以下内容均非原创,仅作学习.分享!! 在 一些大型的网站或者应用中,单台的SQL Server 服务器可能难以支撑非常大的访问压力.很多人在这时候,第一个想到的就是一个解决性能问题的利器——负载均衡. ...

  6. hdu 4828 Grids 卡特兰数+逆元

    Grids Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Problem D ...

  7. 数据库分库分表(sharding)

    地址: http://blog.csdn.net/column/details/sharding.html

  8. asp.netMVC中,视图层和控制器层的传值

    Asp.Net Mvc 控制器与视图的数据传递 摘要:本文将讨论asp.net mvc框架中的数据传递. 数据传递也就是控制器和视图之间的交互,比如在视图中提交的数据,在控制器怎么获取,或者控制器从业 ...

  9. servlet文件上传

    1.获取文件上传路径 String path=request.getServletContext.getRePath("/WEB-INF/resources"); 2.获得工厂 3 ...

  10. [转载] 新浪微博MySQL优化的小结和反思

    原文: http://mp.weixin.qq.com/s?__biz=MzA4Nzg5Nzc5OA==&mid=206762682&idx=1&sn=1233ed1496d7 ...