最短路+记忆化搜索
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. php扩展开发-面向对象

    在zval变量里IS_OBJECT类型使用zend_object_value来保存变量的,我们看一下他的具体结果. typedef struct _zend_object_value { zend_o ...

  2. 01 mysql 基础一 (进阶)

    mysql基础一 1.认识mysql与创建用户 01 Mysql简介 Mysql是最流行的关系型数据库管理系统之一,由瑞典MySQLAB公司开发,目前属于Oracle公司. MySQL是一种关联数据库 ...

  3. 18式优雅你的Python

    本文来自读者梁云同学的投稿,公众号:Python与算法之美 一,优雅你的Jupyter 1,更改Jupyter Notebook初始工作路径 平凡方法: 在cmd中输入jupyter notebook ...

  4. java线程安全(单例模式)(转载)

    原文链接:http://www.jameswxx.com/java/%E8%AF%B4%E8%AF%B4%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/ 单例模式?多么简单! ...

  5. 《Cracking the Coding Interview》——第4章:树和图——题目7

    2014-03-19 04:48 题目:最近公共父节点问题. 解法1:Naive算法,先对其高度,然后一层一层往上直到找到结果. 代码: // 4.7 Least Common Ancestor // ...

  6. USACO Section1.3 Ski Course Design 解题报告

    skidesign解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------ ...

  7. 【Dual Support Vector Machine】林轩田机器学习技法

    这节课内容介绍了SVM的核心. 首先,既然SVM都可以转化为二次规划问题了,为啥还有有Dual啥的呢?原因如下: 如果x进行non-linear transform后,二次规划算法需要面对的是d`+1 ...

  8. QA面试题:之一(中英文题目、难度:简单)

    QA面试题:之一(中英文题目.难度:简单)

  9. 一些优秀的SLAM博主

    http://blog.csdn.net/u010566411 http://blog.csdn.net/qq_18661939/article/details/51782376 http://www ...

  10. CodeForces-999D Equalize the Remainders

    题目链接 https://vjudge.net/problem/CodeForces-999D 题面 Description You are given an array consisting of ...