【最短路+dfs+dijkstra】杭电 hdu 1142 A Walk Through the Forest

来源:互联网 发布:linux curl post get 编辑:程序博客网 时间:2024/06/05 17:36

/* THE PROGRAM IS MADE BY PYY *//*----------------------------------------------------------------------------//Copyright (c) 2011 panyanyany All rights reserved.URL   : http://acm.hdu.edu.cn/showproblem.php?pid=1142Name  : 1142 A Walk Through the ForestDate  : Friday, January 13, 2012Time Stage : 4 hoursResult: 52523362012-01-13 16:18:59Accepted114278MS4124K2027 BC++pyy52523232012-01-13 16:16:15Wrong Answer114262MS4124K2046 BC++pyyTest Data :Review :一开始果断不会做,但想靠自己的大脑想出答案来……结果思索了几个小时死了无数脑细胞,终于还是想不出来,只能看答案了……解题思路果然是相当有技巧啊……下面是几位大牛们的解题报告:http://www.cnblogs.com/liuqidong/archive/2010/07/28/1787217.htmlhttp://www.cppblog.com/Dreams/archive/2010/09/04/78871.html很好很强大,只是我觉得这种做法好像不能处理下面的数据:5 61 3 31 4 23 4 11 5 124 2 345 2 24正确结果为 2可惜我的思路又不正确= =!我觉得这题好奇怪啊~~纠结啊//----------------------------------------------------------------------------*/#include <stdio.h>#include <string.h>#define min(x, y)((x) < (y) ? (x) : (y))#define max(x, y)((x) > (y) ? (x) : (y))#define INF0x3f3f3f3f#define MAXN1002boolused[MAXN] ;intn, m ;intmap[MAXN][MAXN], dist[MAXN], pathCnt[MAXN] ;// 由 dijkstra 算出各点到 home 的距离void dijkstra (){int i, j ;int iMinPath, MinPath ;memset (used, 0, sizeof (used)) ;for (i = 1 ; i <= n ; ++i)dist[i] = map[2][i] ;dist[2] = 0 ;for (i = 1 ; i <= n ; ++i){iMinPath = 0 ;MinPath = INF ;for (j = 1 ; j <= n ; ++j)if (!used[j] && dist[j] < MinPath){iMinPath = j ;MinPath = dist[j] ;}used[iMinPath] = true ;for (j = 1 ; j <= n ; ++j){if (!used[j])dist[j] = min (dist[iMinPath] + map[iMinPath][j], dist[j]) ;}}}// 用 dfs 计算一共有多少条 最短路int dfs (const int start){if (start == 2)return 1 ;// 若 start 点已被检查过,则直接返回if (pathCnt[start] != -1)return pathCnt[start] ;int i, sum ;sum = 0 ;for (i = 1 ; i <= n ; ++i){// start 和 i 之间必须有直接路径,// 且此路径加上 i 到 home 的距离 等于 start 到 home 的距离/*dist[start] > dist[i] 这种写法我觉得应该是不对的,因为它过不了下面的数据:5 61 3 31 4 23 4 11 5 124 2 345 2 24正确答案为 2 (如果我没有算错的话)换成这样子就可以过:(map[start][i] == dist[start] - dist[i]))但是却过不了杭电……*/if ((map[start][i] != INF) && dist[start] > dist[i]){sum += dfs (i) ;}}return pathCnt[start] = sum ;}int main (){int i ;int x, y, c ;while (scanf ("%d", &n), n){scanf ("%d", &m) ;memset (map, INF, sizeof (map)) ;for (i = 0 ; i < m ; ++i){scanf ("%d%d%d", &x, &y, &c) ;map[x][y] = map[y][x] = c ;}dijkstra () ;memset (pathCnt, -1, sizeof (pathCnt)) ;printf ("%d\n", dfs(1)) ;}return 0 ;}