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<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 typedef struct
 6 {
 7     int arcs[1010][1010];
 8     int vexnum,arcnum;
 9     int vexs[1010];
10 } AMGraph;
11 AMGraph G;
12 int D[1010],path[1010],S[1010],dp[1010];///这里忽略掉path吧,没用到
13 const int maxint = 1000000000;
14 int n,m;
15 void createG(AMGraph &G)
16 {
17     int x,y,distance;
18     for(int i = 1 ; i <=n; i++)
19         for(int j =1; j<=n; j++)
20             G.arcs[i][j] = maxint; ///建图,不连通的用一个能够满足题意的无穷大值表示
21     for(int i = 0; i<m; i++)
22     {
23         scanf("%d%d%d",&x,&y,&distance);
24         G.arcs[x][y] = G.arcs[y][x] = distance;
25     }
26 }
27 void shortestflyod(AMGraph &G,int v0)///书上代码,不懂得还是看书吧
28 {
29     int v,w;
30     for( v = 1; v<=n; v++)
31     {
32         S[v] = 0;
33         D[v] = G.arcs[v0][v];
34         if(D[v]<maxint) path[v] = v0;
35         else path[v] = -1;
36     }
37     S[v0] = 1;
38     D[v0] = 0;
39     for(int i =2 ; i<=n; i++)
40     {
41         int minn = maxint;
42         for( w = 1; w<=n; w++)
43             if(!S[w]&&D[w]<minn)
44             {
45                 v = w;
46                 minn = D[w];
47             }
48         S[v] = 1;
49         for(w = 1; w<=n; w++)
50             if(!S[w]&&D[v]+G.arcs[v][w]<D[w])
51             {
52                 D[w] = D[v] + G.arcs[v][w];
53                 path[w] = v;
54             }
55     }
56 }
57 int  dfs(int v)
58 {
59     if(v==2)///到终点,找到一条路径
60     {
61         return 1;
62     }
63     if(dp[v]) return dp[v];///计算过,直接返回
64     for(int i = 1; i<=n; i++)
65         if(G.arcs[v][i]!=maxint&&D[i]<D[v])//连通且满足条件
66             dp[v] += dfs(i);//dp[v] 等于下面一个分支的路径数之和
67     return dp[v];
68 }
69 int main()
70 {
71     while(scanf("%d",&n)&&n)
72     {
73         scanf("%d",&m);
74         createG(G);
75         shortestflyod(G,2);
76         memset(dp,0,sizeof(dp));
77         int ans = 0;
78         ans = dfs(1);
79         printf("%d\n",ans);
80     }
81     return 0;
82 }
时间: 2024-08-07 04:32:09

hdu 1142 最短路+记忆化的相关文章

hdu 2833 WuKong(最短路径+记忆化搜索)

http://acm.hdu.edu.cn/showproblem.php?pid=2833 大致题意:给定一个无向图,以及悟空和师傅起点与终点,求它们分别从起点到终点的最短路径中经过相同的点的最大个数. 思路:首先dijkstra求出最短路,那么如果有dis[a] + map[a][b] = dis[b],则边(a,b)一定在最短路径上.根据这一定理可以求出所有最短路径.然后类似于求最长公共子序列求经过的相同点的最大个数. 即若a==b ,dp[a][b] = max(dp[i][j]+1)

HDU 4597 Play Game(记忆化搜索,深搜)

题目 //传说中的记忆化搜索,好吧,就是用深搜//多做题吧,,这个解法是搜来的,蛮好理解的 //题目大意:给出两堆牌,只能从最上和最下取,然后两个人轮流取,都按照自己最优的策略,//问说第一个人对多的分值.//解题思路:记忆化搜索,状态出来就非常水,dp[fl][fr][sl][sr][flag],//表示第一堆牌上边取到fl,下面取到fr,同样sl,sr为第二堆牌,flag为第几个人在取.//如果是第一个人,dp既要尽量大,如果是第二个人,那么肯定尽量小. http://www.2cto.co

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

hdu 4597 Play Game(记忆化搜索)

题目链接:hdu 4597 Play Game 题目大意:给出两堆牌,仅仅能从最上和最下取,然后两个人轮流取,都依照自己最优的策略.问说第一个人对多的分值. 解题思路:记忆化搜索,状态出来就很水,dp[fl][fr][sl][sr][flag],表示第一堆牌上边取到fl,以下取到fr,相同sl.sr为第二堆牌,flag为第几个人在取.假设是第一个人,dp既要尽量大,假设是第二个人,那么肯定尽量小. #include <cstdio> #include <cstring> #incl

HDU - 1428【bfs+记忆化】

点击查看详情--<IJCAI 2017 口碑商家客流量预测大赛> 漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4205    Accepted Submission(s): 1317 Problem Description LL最近沉迷于AC不能自拔,每天寝室.机房两点一线.由于长时间坐在电脑边,缺乏运动.他决定充分利用每

*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 1428-漫步校园(记忆化搜索)

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

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

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

HDU 3779 Railroad(记忆化搜索)

Railroad Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 10   Accepted Submission(s) : 3 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description A train yard is a complex ser