标签:
最短路+记忆化搜索
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 }
标签:
原文地址:http://www.cnblogs.com/jiachinzhao/p/4547873.html