题目大意: 给你一个图,找最短路。但是有个非一般的的条件:如果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. 北科大计算机小学期,北京科技大学小学期计算机实践(C++源代码)
  2. LeetCode 375. Guess Number Higher or Lower II
  3. 成功解决dos内的输入ipconfig出现错误:不是内部或外部命令……
  4. LightGBM笔记
  5. 微信开发者工具 出现 Error:unable to verify the first cert?
  6. 检测和测试停滞的流– RxJava常见问题解答
  7. php gridview,PHP编程:yii2-GridView在开发中常用的功能及技巧总结
  8. Owner PID: 7948 Our PID: 7064
  9. 阶段3 2.Spring_01.Spring框架简介_04.spring发展历程
  10. LaTeX之表格中强制换行
  11. 五、实现一个10秒钟的倒计时,即:从10~0依次打印,每次打印间隔一秒
  12. 如何使用计算机小学生课件,小学信息技术计算机基础ppt课件
  13. 爬取国家统计局数据正式篇
  14. 冒险岛里不合逻辑的地方
  15. 二工大计算机专业,两电一邮与哈工大:计算机专业哪所实力最强?看完就知道...
  16. leangoo脑图-共享式多人协作思维导图工具分享
  17. 解决react native打包apk文件安装好之后进入应用闪退的问题
  18. oracle回撤,Oracle使用排列组合计算最大回撤幅度
  19. 机械臂机器人——使用Matlab Robotic ToolBox建立四轴机械臂模型并实现运动控制仿真
  20. Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)

热门文章

  1. Android之抓取adb logcat全日志后怎么过滤掉只包含当前app进程的日志(一般抓启动app奔溃日志)
  2. C和指针之数组名和数组名和首元素以及sizeof(数组名)和sizeof(数组名作为参数)区别
  3. linux环境下用TcpDump抓包分析总结
  4. Android之FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
  5. 【iVX 初级工程师培训教程 10篇文拿证】04 画布及我和 iVX 合照
  6. 25岁男生要有多少存款才能让女友满意?
  7. TED演讲:区块链将如何改变世界?看完太震撼了!
  8. hive集成spark和mysql
  9. matlab浮点数求绝对值_MATLAB仿真阵列天线切比雪夫综合法(附代码)
  10. 热像仪 二次开发 c++_一种全新的红外热像仪——“可编程红外热像仪”