hdu1142(最短路+记忆化搜索)

http://acm.hdu.edu.cn/showproblem.php?pid=1142

题目意思挺模糊

大致思路,以终点为源点,做一次单源最短路

深搜一遍图(下一步到达的位置  比现在位置  离终点更近)

记录每个节点上可行数

 1 #include <bits/stdc++.h>
 2
 3 struct Edge
 4 {
 5     int v, w;
 6     Edge(int _v, int _w): v(_v), w(_w){}
 7 };
 8
 9 const int MAXN = 1000 + 10;
10
11 std::vector<Edge> E[MAXN];
12
13 int n, m, dp[MAXN];
14
15 bool vis[MAXN];
16 int dist[MAXN];
17
18 void init()
19 {
20     memset(vis, false, sizeof(vis));
21     memset(dp, 0, sizeof(dp));
22     for(int i = 1; i <= n; ++ i){
23         dist[i] = 1<<30;
24         E[i].clear();
25     }
26 }
27
28 void addEdge(int a, int b, int d)
29 {
30     E[a].push_back(Edge(b, d));
31     E[b].push_back(Edge(a, d));
32 }
33
34 void spfa(int start)
35 {
36     vis[start] = true;
37     dist[start] = 0;
38     std::queue<int> que;
39     que.push(start);
40     while(que.empty()==false){
41         int u = que.front();
42         que.pop();
43         vis[u] = false;
44         for(int i = 0; i < E[u].size(); ++ i){
45             int v = E[u][i].v;
46             int w = E[u][i].w;
47             if(dist[v] > dist[u] + w){
48                 dist[v] = dist[u] + w;
49                 if(vis[v] == false){
50                     que.push(v);
51                 }
52             }
53         }
54     }
55 }
56
57
58 int dfs(int u)
59 {
60     if(u == 2)
61         return 1;
62     if(dp[u] > 0){
63         return dp[u];
64     }
65     for(int i = 0; i < E[u].size(); ++ i){
66         int v = E[u][i].v;
67         if(dist[u] > dist[v]){
68             dp[u] += dfs(v);
69         }
70     }
71     return dp[u];
72 }
73
74 int main()
75 {
76     while(scanf("%d", &n) && n){
77         scanf("%d", &m);
78         init();
79         for(int i = 1; i <= m; ++ i){
80             int a, b, d;
81             scanf("%d%d%d", &a, &b, &d);
82             addEdge(a, b, d);
83         }
84         spfa(2);
85         printf("%d\n", dfs(1));
86     }
87 }
时间: 2024-10-12 21:17:58

hdu1142(最短路+记忆化搜索)的相关文章

*HDU1142 最短路+记忆化dfs

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

HDU 1142 A Walk Through the Forest(最短路+记忆化搜索)

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

Luogu P3953 逛公园(最短路+记忆化搜索)

P3953 逛公园 题面 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 \(N\) 个点 \(M\) 条边构成的有向图,且没有自环和重边.其中 \(1\) 号点是公园的入口,\(N\) 号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策策每天都会去逛公园,他总是从 \(1\) 号点进去,从 \(N\) 号点出来. 策策喜欢新鲜的事物,它不希望有两天逛公园的路线完全一样,同时策策还是一个 特别热爱学习的好孩子,它不希望每天在逛公园这件事上花费太多的时间.如果 \(

hdu 1428 漫步校园 (最短路+记忆化搜索)

漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3023    Accepted Submission(s): 917 Problem Description LL最近沉迷于AC不能自拔,每天寝室.机房两点一线.由于长时间坐在电脑边,缺乏运动.他决定充分利用每次从寝室到机房的时间,在校园里散散步.整个HDU校园呈方形布局,可划

POJ 2662-A Walk Through the Forest(最短路+记忆化搜索)

题目链接: 传送门 题意很重要.. 就是求求起点到终点按要求走有多少条路径.对于任意两点A,B,能从A走到B的条件是存在一条从B到终点的路的长度 小于任意一条A到终点的路,即B到终点的最短路小于A到终点的最短路.为什么呢?想一下,现在要在B到终点的路径中找出一条路满足它的长度小于 A到终点的最短路(这个好想,体会任意那两个字),所以当B到终点的最短路满足上述条件时,才满足最开始那个条件.(因为如果B到终点的最短路都不满足小于任意一条A到终点的路的话,那么其他的就更不满足了..) 然后就是dfs搜

hdu 1142 最短路+记忆化

最短路+记忆化搜索 HDU 1142 A Walk Through the Forest 链接:http://acm.hdu.edu.cn/showproblem.php?pid=1142 题意:找出不同的路径条数,假如jimmy要从A走到B的话满足jimmy从B到家的距离比从A到家的距离短 这样我们可以通过最短路算法,找出从家(看成源点)到各个点的最短路径长度,记做D[v]. 然后就可以从起点(office) dfs,首先从某点i到某点j走得通,然后满足D[j] 1 #include<stdi

HDU1142 A Walk Through the Forest 【SPFA】+【记忆化搜索】

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

hduoj----1142A Walk Through the Forest(记忆化搜索+最短路)

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

codeforces1202B You Are Given a Decimal String... 记忆化搜索或Floyd最短路算法

网址:http://codeforces.com/problemset/problem/1202/B 题意: 这个题真的挺绕的,草(中日双语),就是给出一串序列,然后你可以往里面填数,使得填数后的序列可以被$x-y$计数器输出.$x-y$计数器的工作方式是:初始是$0$,每一步加上$x$或者加上$y$,然后输出对$10$取余的数.输出$0<x,y<10$的$x-y$计数器下需要添加的字符数最小值,若无法满足输出$-1$. 题解: 草,比赛时靠着网上的资料一步步写出的记忆化搜索的方法,想不出正解