UVa 10917 A Walk Through the Forest
2016-03-30 17:28
716 查看
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变小的边记忆化搜索路径条数。
【代码】
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 }
相关文章推荐
- UVA1416 Warfare And Logistics
- UVA10054 The Necklace
- UVa10047 The Monocycle
- 洛谷2656 采蘑菇
- 洛谷2657 低头一族
- 洛谷2658 汽车拉力比赛
- 洛谷1419 寻找段落(单调队列)
- 洛谷1901 发射站(单调栈)
- 洛谷1725 琪露诺(单调队列)
- UVa816 Abbott&#39;s Revenge
- 洛谷1196 银河英雄传说(并查集)
- BZOJ4195 [Noi2015]程序自动分析(离散化+并查集)
- 洛谷1455 搭配购买(并查集)
- org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
- c#学习之四:编写单例的两种形式
- C++中 类的构造函数理解(一)
- 一张图告诉你什么叫正向代理,什么叫反向代理
- 太乐了
- 安装Elasticsearch集群
- Android learn web site