UVa 10917 A Walk Through the Forest

A Walk Through the Forest

Time Limit:1000MS  Memory Limit:65536K
Total Submit:48 Accepted:15

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

【思路】

最短路+记忆化搜索。

SPFA预处理出每个点到达home的最短距离d,然后沿着d变小的边记忆化搜索路径条数。

【代码】

 1 #include<cstdio>
 2 #include<queue>
 3 #include<vector>
 4 #include<cstring>
 5 using namespace std;
 6
 7 const int maxn = 1000+10;
 8 const int INF=1<<30;
 9 struct Edge{
10     int u,v,w,next;
11 }e[2*maxn*maxn];
12 int en,front[maxn];
13
14 int n,m;
15
16 inline void AddEdge(int u,int v,int w) {
17     en++; e[en].v=v; e[en].w=w; e[en].next=front[u]; front[u]=en;
18 }
19
20 int d[maxn];
21 void SPFA(int s) {
22     int inq[maxn];
23     queue<int> q;
24     memset(inq,0,sizeof(inq));
25     for(int i=1;i<=n;i++) d[i]=INF;
26
27     d[s]=0; inq[s]=1; q.push(s);
28     while(!q.empty()) {
29         int u=q.front(); q.pop(); inq[u]=0;
30         for(int i=front[u];i>=0;i=e[i].next) {
31             int v=e[i].v,w=e[i].w;
32             if(d[v]>d[u]+w) {
33                 d[v]=d[u]+w;
34                 if(!inq[v]) {
35                     inq[v]=1;
36                     q.push(v);
37                 }
38             }
39         }
40     }
41 }
42
43 int f[maxn];
44 int dp(int u) {
45     int& ans=f[u];
46     if(ans>=0) return ans;
47
48     if(u==2) return ans=1;
49     ans=0;
50     for(int i=front[u];i>=0;i=e[i].next) {
51         int v=e[i].v;
52         if(d[v]<d[u]) ans += dp(v);    //只沿着d更小的走
53     }
54     return ans;
55 }
56 int main() {
57     while(scanf("%d%d",&n,&m)==2) {
58         en=-1;
59         memset(front,-1,sizeof(front));
60         int u,v,w;
61         for(int i=0;i<m;i++) {
62             scanf("%d%d%d",&u,&v,&w);
63             AddEdge(u,v,w);
64             AddEdge(v,u,w);
65         }
66         SPFA(2);
67         memset(f,-1,sizeof(f));
68         printf("%d\n",dp(1));
69     }
70     return 0;
71 }
时间: 2024-10-09 21:16:32

UVa 10917 A Walk Through the Forest的相关文章

UVA - 10917 Walk Through the Forest (最短路+DP)

题意:Jimmy打算每天沿着一条不同的路走,而且,他只能沿着满足如下条件的道路(A,B):存在一条从B出发回家的路径,比所有从A出发回家的路径都短,你的任务是计算有多少条不同的路径 从后往前找最短路, 对于每一步要更新之后走的位置值: #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<algorithm> using namespace s

uva 10917 Walk Through the Forest(最短路)

uva 10917 Walk Through the Forest gbn最近打算穿过一个森林,但是他比较傲娇,于是他决定只走一些特殊的道路,他打算只沿着满足如下条件的(A,B)道路走:存在一条从B出发回家的路,比所有从A出发回家的路径都短.你的任务是计算一共有多少条不同的回家路径.其中起点的编号为1,终点的编号为2. Input 多组数据输入,每组数据第一行输入n,m(1<=n<=1000)表示点的数目和边的数目,点的编号为1~n,接下来m行每行输入3个数a,b,c表示有一条双向道路连接a,

UVA 10917 - Walk Through the Forest(dijstra)

UVA 10917 - Walk Through the Forest 题目链接 题意:公司编号为1,家编号为2,每次回家都不走回头路,回头路定义为:满足条件的道路(A,B),满足存在一条从B出发比所有从A出发的回家的路径都短,问有几种走法 思路:先从家求dijstra,这样满足条件的道路就是d[A] > d[B],这个图是一个dag,在上面进行dp就可以找出种数了 代码: #include <cstdio> #include <cstring> #include <v

uva 10917

Problem C: A Walk Through the Forest 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

训练指南 UVA - 10917(最短路Dijkstra + 基础DP)

layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: true mathjax: true tags: - 最短路 - 基础DP - Dijkstra - 图论 - 训练指南 Walk Through the Forest UVA - 10917 题意 Jimmy打算每天沿着一条不同的路走,而且,他只能沿着满足如下条件的道路(A,B):存在一条从B出发回家的路径,比

uva 503 - Parallelepiped walk(几何)

题目链接:uva 503 - Parallelepiped walk 恶心题,将三维转成两维,直线距离最短,WA了一天.假设起点在地面,除了考虑经过0,1个面的可能,还要考虑经过两个面到达的可能.后面提供一个生成数据的代码. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const ll inf = 0x3f3f3f

HDU 1142 A Walk Through the Forest (Dijkstra + 记忆化搜索 好题)

A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6350    Accepted Submission(s): 2332 Problem Description Jimmy experiences a lot of stress at work these days, especial

UVA - 10596 - Morning Walk (欧拉回路!并查集判断回路)

UVA - 10596 Morning Walk Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem H Morning Walk Time Limit 3 Seconds Kamal is a Motashota guy. He has got a new job in Chittagong . So, he has moved to Ch

hdu 1142 A Walk Through the Forest (最短路+dfs )

A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5809    Accepted Submission(s): 2147 Problem Description Jimmy experiences a lot of stress at work these days, especial