/* THE PROGRAM IS MADE BY PYY */
/*----------------------------------------------------------------------------//
Copyright (c) 2011 panyanyany All rights reserved.
URL : http://acm.hdu.edu.cn/showproblem.php?pid=1142
Name : 1142 A Walk Through the Forest
Date : Friday, January 13, 2012
Time Stage : 4 hours
Result:
5252336 2012-01-13 16:18:59 Accepted 1142
78MS 4124K 2027 B
C++ pyy
5252323 2012-01-13 16:16:15 Wrong Answer 1142
62MS 4124K 2046 B
C++ pyy
Test Data :
Review :
一开始果断不会做,但想靠自己的大脑想出答案来……结果思索了几个小时
死了无数脑细胞,终于还是想不出来,只能看答案了……
解题思路果然是相当有技巧啊……
下面是几位大牛们的解题报告:
http://www.cnblogs.com/liuqidong/archive/2010/07/28/1787217.html
http://www.cppblog.com/Dreams/archive/2010/09/04/78871.html
很好很强大,只是我觉得这种做法好像不能处理
下面的数据:
5 6
1 3 3
1 4 2
3 4 1
1 5 12
4 2 34
5 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 INF 0x3f3f3f3f
#define MAXN 1002
bool used[MAXN] ;
int n, m ;
int map[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 6
1 3 3
1 4 2
3 4 1
1 5 12
4 2 34
5 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 ;
}