最短路+记忆化搜索
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]<D[j],则可以往下搜索,直到终点(house),普通的dfs是会超时的,N都是1000了,不加剪枝啥的,dfs生成树那么大,肯定会TLE的。
> 所以这里要用记忆话搜索,减少重复计算某个一个状态的值。 对于最短路和记忆化,本人也是刚刚学习的,最短路模仿的数据结构书上的
> dijkstra,记忆化也是借鉴别人的思路。不过我想说说子结构的重复计算 比如 0
> 1 2
> 3 4 5 6

> 7 8 9

>  10   dfs(0) 是 从0到10的所以路径条数(假设走法随意,只要深度+1即可) dfs(4)是从4到10的路径条数,1可以到4,2也可以到4.
> 那么dfs(1)后肯定已经计算过dfs(4)了,dfs(2)就没必要再计算,直接用这个结果就行了 所以可以用个数组保存即可
> 再啰嗦一句,题库分这题在并查集里面,有哪位大神能教我并查集怎么做?

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef struct
{
int arcs[][];
int vexnum,arcnum;
int vexs[];
} AMGraph;
AMGraph G;
int D[],path[],S[],dp[];///这里忽略掉path吧,没用到
const int maxint = ;
int n,m;
void createG(AMGraph &G)
{
int x,y,distance;
for(int i = ; i <=n; i++)
for(int j =; j<=n; j++)
G.arcs[i][j] = maxint; ///建图,不连通的用一个能够满足题意的无穷大值表示
for(int i = ; i<m; i++)
{
scanf("%d%d%d",&x,&y,&distance);
G.arcs[x][y] = G.arcs[y][x] = distance;
}
}
void shortestflyod(AMGraph &G,int v0)///书上代码,不懂得还是看书吧
{
int v,w;
for( v = ; v<=n; v++)
{
S[v] = ;
D[v] = G.arcs[v0][v];
if(D[v]<maxint) path[v] = v0;
else path[v] = -;
}
S[v0] = ;
D[v0] = ;
for(int i = ; i<=n; i++)
{
int minn = maxint;
for( w = ; w<=n; w++)
if(!S[w]&&D[w]<minn)
{
v = w;
minn = D[w];
}
S[v] = ;
for(w = ; w<=n; w++)
if(!S[w]&&D[v]+G.arcs[v][w]<D[w])
{
D[w] = D[v] + G.arcs[v][w];
path[w] = v;
}
}
}
int dfs(int v)
{
if(v==)///到终点,找到一条路径
{
return ;
}
if(dp[v]) return dp[v];///计算过,直接返回
for(int i = ; i<=n; i++)
if(G.arcs[v][i]!=maxint&&D[i]<D[v])//连通且满足条件
dp[v] += dfs(i);//dp[v] 等于下面一个分支的路径数之和
return dp[v];
}
int main()
{
while(scanf("%d",&n)&&n)
{
scanf("%d",&m);
createG(G);
shortestflyod(G,);
memset(dp,,sizeof(dp));
int ans = ;
ans = dfs();
printf("%d\n",ans);
}
return ;
}

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

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

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  2. hdu 1428(很好的一道题,最短路+记忆化搜索)

    漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. [HDU 1428]--漫步校园(记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1428 漫步校园 Time Limit: 2000/1000 MS (Java/Others)    M ...

  4. *HDU1142 最短路+记忆化dfs

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  5. UVA - 10917 - Walk Through the Forest(最短路+记忆化搜索)

    Problem    UVA - 10917 - Walk Through the Forest Time Limit: 3000 mSec Problem Description Jimmy exp ...

  6. hdu 4597 Play Game(记忆化搜索)

    题目链接:hdu 4597 Play Game 题目大意:给出两堆牌,仅仅能从最上和最下取,然后两个人轮流取,都依照自己最优的策略.问说第一个人对多的分值. 解题思路:记忆化搜索,状态出来就很水,dp ...

  7. Luogu P2149 [SDOI2009]Elaxia的路线(最短路+记忆化搜索)

    P2149 [SDOI2009]Elaxia的路线 题意 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们必须合理地安排两个人在一起的 ...

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

    P3953 逛公园 题面 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 \(N\) 个点 \(M\) 条边构成的有向图,且没有自环和重边.其中 \(1\) 号点是公园的入口,\(N\) 号点是公 ...

  9. hdu 4856 Tunnels (记忆化搜索)

    Tunnels Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

随机推荐

  1. MySQL中使用group_concat()函数数据被截取(有默认长度限制),谨慎!

    最近在工作中遇到一个问题: 我们系统的一些逻辑处理是用存储过程实现的,但是有一天客服反馈说订单下单失败,查了下单牵扯到的产品基础资源,没有问题. 下单的存储过程中有这样两句代码: ; ; ; 执行存储 ...

  2. IOS中input与fixed同时存在的情况会出现bug

    两种解决方案,一种是将内容区域放在中间部分,只是中间部分在滚动(还是固定在底部):另一种是判断当是ios时,将其转换为absolute定位.(跟随着页面的滚动而滚动);; 当使用input时,fixe ...

  3. (转)Clang 比 GCC 编译器好在哪里?

    编译速度更快.编译产出更小.出错提示更友好.尤其是在比较极端的情况下.两年多前曾经写过一个Scheme解释器,词法分析和语法解析部分大约2000行,用的是Boost.Spirit--一个重度依赖C++ ...

  4. 平衡二叉查找树 AVL 的实现

    不同结构的二叉查找树,查找效率有很大的不同(单支树结构的查找效率退化成了顺序查找).如何解决这个问题呢?关键在于如何最大限度的减小树的深度.正是基于这个想法,平衡二叉树出现了. 平衡二叉树的定义 (A ...

  5. js匿名函数运行的方法

    Javascript中定义函数的方式有多种,函数直接量就是其中一种.如var fun = function(){},这里function如果不赋值给fun那么它就是一个匿名函数.好,看看匿名函数的如何 ...

  6. JRE和JDK区别

    JRE: Java Runtime Environment JDK:Java Development Kit JRE顾名思义是java运行时环境, 包含了java虚拟机,java基础类库. 是使用ja ...

  7. C++ 无符号整型和整型的区别

    在Win 7系统中,short 表示的范围为 - 32767到 32767,而无符号的short表示的范围为0 到 65535,其他类型的同理可推导出来,当然,仅当数字不为负的时候才使用无符号类型. ...

  8. 笔记-python-standard library-26.4 unittest

    笔记-python-standard library-26.4 unittest 1.      unittest source code:Lib/unittest/__init__.py 它是pyt ...

  9. 奇异值分解(SVD)原理详解及推导

    在网上看到有很多文章介绍SVD的,讲的也都不错,但是感觉还是有需要补充的,特别是关于矩阵和映射之间的对应关系.前段时间看了国外的一篇文章,叫A Singularly Valuable Decompos ...

  10. static任我行- 为人不注意的static

    前几天一直在想,static方法如果没有被调用,会不会分配内存的问题,查了一下资料,终于得到了一个官方的说法了. static 方法调用:使用比较频繁的时候使用,像数据库连接串,Connection ...