码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1142 最短路+记忆化

时间:2015-06-02 23:23:16      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

最短路+记忆化搜索 
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 }

 

hdu 1142 最短路+记忆化

标签:

原文地址:http://www.cnblogs.com/jiachinzhao/p/4547873.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!