杭电1142(最短路径+dfs)

A Walk Through the Forest

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5421    Accepted Submission(s):
1988

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

思路:

用dis求最短路径,用dfs求最短路径的数量

代码:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4
 5 #define INF 0xfffffff
 6
 7
 8 int map[1005][1005], disk[1005], pathnum[1005];
 9 int n, m;
10
11 int getmin(int x, int y){
12     return x > y ? y : x;
13 }
14
15 int dis(){
16     int i, j, visit[1005], idmin, min;
17     memset(visit, 0, sizeof(visit));
18     for(i = 1; i <= n; i ++){
19         disk[i] = map[2][i];
20     }
21     disk[2] = 0;
22     for(i = 1; i <= n; i ++){
23         idmin = 0;
24         min = INF;
25         for(j = 1; j <= n; j ++){
26             if(!visit[j] && disk[j] < min){
27                 min = disk[j];
28                 idmin = j;
29             }
30         }
31         visit[idmin] = 1;
32         for(j = 1; j <= n; j ++){
33             if(!visit[j]){
34                 disk[j] = getmin(disk[j], map[idmin][j] + disk[idmin]);
35             }
36         }
37     }
38     return 0;
39 }
40
41 int dfs(int start){
42     int sum, i;
43     if(start == 2){
44         return 1;
45     }
46     if(pathnum[start] != -1){
47         return pathnum[start];
48     }
49     sum = 0;
50     for(i = 1; i <= n; i ++){
51         if(map[i][start] != INF && map[i][start] == disk[start] - disk[i]){
52             sum += dfs(i);
53         }
54     }
55     pathnum[start] = sum;
56     return pathnum[start];
57 }
58
59 int main(){
60     int x, y, d, i, j;
61     while(scanf("%d", &n) && n){
62         scanf("%d", &m);
63         for(i = 0; i < 1005; i ++){
64             for(j = 0; j < 1005; j ++){
65                 map[i][j] = INF;
66             }
67         }
68         //printf("%d\n", map[1][1]);
69         for(i = 0; i < m; i ++){
70             scanf("%d %d %d", &x, &y, &d);
71             map[x][y] = map[y][x] = d;
72         }
73         dis();
74         //printf("%d\n", disk[1]);
75         memset(pathnum, -1, sizeof(pathnum));
76         //printf("%d\n", pathnum[1]);
77         printf("%d\n", dfs(1));
78     }
79     return 0;
80 }

杭电1142(最短路径+dfs)

时间: 2024-10-12 14:19:37

杭电1142(最短路径+dfs)的相关文章

杭电3790最短路径问题

最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 17946    Accepted Submission(s): 5374 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,假设最短距离有多条路线,则输出花费最少的. Input

变形课 HUD杭电1181 【DFS】

Problem Description 呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规律:如果咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体. Harry已经将他所会的所有咒语都列成了一个表,他想让你帮忙计算一下他是否能完成老师的作业,将一个B(ball)变成一个M(Mouse),你知道,如果他自己不能完成的话,他就只好向Hermione请教,并且被迫听

Fire Net HDU杭电1045【DFS】

Problem Description Suppose that we have a square city with straight streets. A map of a city is a square board with n rows and n columns, each representing a street or a piece of wall. A blockhouse is a small castle that has four openings through wh

Sum It Up POJ 1564 HDU 杭电1258【DFS】

Problem Description Given a specified total t and a list of n integers, find all distinct sums using numbers from the list that add up to t. For example, if t=4, n=6, and the list is [4,3,2,2,1,1], then there are four different sums that equal 4: 4,3

杭电4707--Pet (Dfs)

Pet Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1788    Accepted Submission(s): 863 Problem Description One day, Lin Ji wake up in the morning and found that his pethamster escaped. He searc

hdu 1016 Prime Ring Problem DFS解法 纪念我在杭电的第一百题

Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 29577    Accepted Submission(s): 13188 Problem Description A ring is compose of n circles as shown in diagram. Put natural num

杭电1869-六度分离(最短路径,dijkstra,spfa,floyd)

六度分离 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6529    Accepted Submission(s): 2636 Problem Description 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为"小世界现象(small world phenomenon)"的著名假说,大意是说,任何2个素

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY

【转】对于杭电OJ题目的分类

[好像博客园不能直接转载,所以我复制过来了..] 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDI