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. UVA 442 二十 Matrix Chain Multiplication

    Matrix Chain Multiplication Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %l ...

  2. 【翻译】Anatomy of a Program in Memory—剖析内存中的一个程序(进程的虚拟存储器映像布局详解)

    [翻译]Anatomy of a Program in Memory—剖析内存中的一个程序(进程的虚拟存储器映像布局详解) . . .

  3. Maven 3.3.9在Windows上的安装

    开始学Maven了,可是我一个项目都木有做过.听过Maven 的大名,用来构建项目的. 下面记录下我安装Maven的过程 1.确认电脑上安装了JDK 在cmd下执行下列命令: java –versio ...

  4. CUBRID学习笔记 39 net使用dataset 返回查询的数据

    using CUBRID.Data.CUBRIDClient;    namespace DataSetExample {     class Program     {         static ...

  5. hdu 1700 Points on Cycle(坐标旋转)

    http://acm.hdu.edu.cn/showproblem.php?pid=1700 Points on Cycle Time Limit: 1000/1000 MS (Java/Others ...

  6. Tomcat配置虚拟目录

    在Tomcat7版本下,配置虚拟路径修改以下两个文件:     1.server.xml     打开Tomcat目录下的/conf/server.xml文件,在Host之前加入下面红色部分的内容. ...

  7. Android中序列化对象到XMl 和 XML反序列化为对象

    package com.example.xmloperation; import java.io.File; import java.io.FileOutputStream; import java. ...

  8. Redis基础知识之————php-Redis 常用命令专题

    Keys del,delete - 删除键 dump - 返回存储在指定键值的序列化版本. exists - 确定键是否存在 expire,setTimeout,pexpire - 设置键的生存时间( ...

  9. Java中的Swing键盘绑定案例

    package ch12; import javax.swing.*; import java.awt.*; import java.awt.event.*; /** * Created by Jiq ...

  10. 转:浅谈C/C++中的指针和数组(一)

    再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...