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

解题思路

: 1.1为起点,2为终点,因为要走ab路时,必须保证那个条件,所以从终点 开始使用单源最短路Dijkstra算法,就得到了最短的一条路,作为找路的 最低限度。

2.然后深搜每条路,看看满足题意的路径有多少条。当然,这个需要从起2 点开始搜,因为dis[i]数组中保存的都是该点到终点的最短距离。

3.这样搜索之后,dp[1]就是从起点到终点所有满足题意的路径的条数。

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
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 1000+10;
const int inf=0x3f3f3f3f;
int w[maxn][maxn]; //建图
int d[maxn]; //记录的是每个点到终点的最短路径长度
int book[maxn];
int dp[maxn]; //每个点到终点的最短路径的条数
int n,m;
void Dijkstra(int aa)
{for(int i = 1; i <= n; i++)d[i] = w[aa][i];d[aa] = 0;memset(book,0,sizeof(book));for(int i = 1; i <= n; i++){int x, m = inf;for(int y = 1; y <= n; y++)if(!book[y] && d[y] <= m){m = d[y];x=y;}book[x] = 1;for(int y = 1; y <= n; y++)d[y] = min(d[y], d[x]+w[x][y]);}
}
int dfs(int u)
{if(dp[u] != -1)return dp[u]; //记忆化搜索if(u == 2)return 1; //如果到达了终点int sum = 0;for(int v = 1; v <= n; v++) //依次遍历每一个点if(w[u][v] != inf && d[v]<d[u]) //如果u到v有路,而且v到终点的最短路径小于 u 到终点的最小路径sum += dfs(v);//路径条数累加dp[u] = sum;return dp[u];//找到的所有路径的结果
}int main()
{while(~scanf("%d", &n)&&n){scanf("%d",&m);memset(w,inf,sizeof(w));memset(dp,-1,sizeof(dp));for(int i = 1; i <= n; i++)w[i][i]=0;int u,v,tt;while(m--){scanf("%d%d%d", &u,&v,&tt);w[u][v] = min(w[u][v], tt); //避免重边的情况w[v][u] = w[u][v]; //无向图}//起点深搜,得到满足题意路径条数Dijkstra(2); //从终点2开始找最短路printf("%d\n", dfs(1)); //起点1到终点2的最短路的条数}return 0;
}

A Walk Through the Forest HDU - 1142(dijkstra+动态规划)相关推荐

  1. A Walk Through the Forest dijkstra(邻接矩阵)

    http://acm.hdu.edu.cn/showproblem.php?pid=1142 dijkstra(邻接矩阵) 1 #include <cstdio> 2 #include & ...

  2. UVA 10917 Walk Through the Forest

    最短路+DP Walk Through the Forest Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld &a ...

  3. HDU 1142 A Walk Through the Forest dijkstra + DFS

    http://acm.hdu.edu.cn/showproblem.php?pid=1142 题意: Jimmy在位置 1 ,每天晚上要回位置2(家),计算1到2的最短距离,Jimmy要先去一个地方然 ...

  4. A Walk Through the Forest

    http://acm.hdu.edu.cn/showproblem.php?pid=1142 题解: 看样子很多人都把这题目看错了,以为是求最短路的条数.真正的意思是:假设 A 和 B 是相连的,当前 ...

  5. hdu 1142 记忆化搜索

    题目是这样的,貌似一开始我这个英语搓的人还理解错了...orz http://acm.hdu.edu.cn/showproblem.php?pid=1142 就是最短路,只不过用dijkstra是从终 ...

  6. HDU_2112 HDU Today(DIjkstra + map映射)

    这题做的真的很想砸电脑!!!!TLE, 完了WA, 检查完错误又RE,无数次的RE,RE,RE,RE!!!RE你妹啊!把字符串定义在while()外边就能过,定义在里边就RE,还有char型能过,st ...

  7. hdu 2544 dijkstra

    链接矩阵+优先队列 #include <iostream> #include <cstring> #include <set> #include <queue ...

  8. hdu 1874 Dijkstra算法模板

    单源最短路径 迪杰斯特拉算法 1.初始化地图,map[i][j]记录城镇 i,j之间最短的道路长度, 若无道路连通 ,则为极大值 2.从起始城镇开始,用广度优先搜索思想,嵌入松弛处理算法, 用dis[ ...

  9. hdu 1142 最短路 + DP

    这题题意好纠结,半天没看懂,后来打完过不了样例,让海峰读题,最后按他的思路打完了,居然在他之前AC,哈哈~ 读懂了题目还是挺简单的,首先求出所有点到终点的最短路,然后DP一下,就能求出路径条数. /* ...

最新文章

  1. WPF 带水印的密码输入框实现
  2. .NET中DLL“没有可放置在工具箱的组件”—FreeTextBox
  3. 用选框工具画圆角矩形
  4. 使用WeexSDK,网络请求信任证书的问题
  5. 枚举生成MVC3: Bind Enum To DropDownList ?-java教程
  6. [转]Java常用概念解答
  7. CCF CSP 201604-1 折点计数
  8. java io 常用类库_JDK 中需要掌握的常用类库
  9. 有哪些知名的短信接口提供商
  10. 柔性电流传感器(柔性电流探头)的工作原理和特点是什么?
  11. 刘宇凡:莫沉浮华,归于平凡
  12. 鸿蒙石之鉴老猴死了怎么办,智取芭蕉扇那个剧情选分支1过不了怎么办
  13. 使用iTunes制作iPhone6s plus铃声
  14. 饿了么推荐系统的从0到1
  15. JavaFx教程-02第一个javaFX程序
  16. NP完全问题的归约-碰撞集(HITTING SET)
  17. zabbix与nagios对比
  18. 世界上最经典的25句话--摘抄
  19. Blockly与Scratch3.0的比较分析
  20. (力扣)171.Excel表列序号(c语言)

热门文章

  1. IOS之提示control may reach end of non-void function
  2. unity5.x C# 获取屏幕宽度 设置不受重力影响
  3. 16岁上大学,25岁博士毕业,她还是南大医学院最年轻的博导!
  4. 三联竟出了这么赞的杂志!各领域佼佼者畅所欲言,为少年建立思维判断体系!
  5. 这9个人气超高的公众号,你还没关注吗?
  6. 魔方内部长啥样?三维动画展示其结构,谁发明的真是个天才
  7. 每日一笑 | 周一,如何才能保持清醒?
  8. 21副酷炫的动图让你了解各种数学概念
  9. 全球100款大数据工具汇总(前50款)
  10. 下班忘打卡了什么后果_工厂园区安装人脸识别门禁系统有什么好处?