hdu1142(spfa+DFS记忆化)

这道题因为英语渣半天没看懂题意,后来在网上找了一些题解发现,好多人题意理解错了,但是代码交上去能过。

最后终于找到了一个能说明白的题解。

链接:http://www.cnblogs.com/ruihua852/archive/2012/08/27/2658910.html

下面是粘贴的链接中的题意:

题目意思是说一个人要从上班的地方回到家里,途中会经过一些地方,按下面规则问他回家会有几种路线:

题目已经定义好1为上班地方2为家,每个地点之间的距离都已经知道,哪么如果从A到B的一条路,可以走的条件

是B到2(家)的路程必须小于从A到2(家)的路程,其实就是A到家的最短路径必须大于B到家的最短路径。

默认一定可以走到家,也就是一定会有一种路线。最后是让你计算有几种路线。

下面是我自己的代码。链接中的题解使用dijkstra,而我用了spfa,因为spfa用得少,就想熟悉一下。

#include <iostream>
#include <stdio.h>
#include <vector>
#include <queue>
#include <memory.h>
#define INF 10000000
using namespace std;
struct node
{
    int e,w;
    node(int ee,int ww):e(ee),w(ww){}
    node(){}
};
int dp[1005];
vector<vector<node> > v;
int dist[1005];
int N,M;
void spfa(int S)
{
    for(int i=1;i<=N;i++)
    {
        dist[i]=INF;
    }
    dist[S]=0;
    queue<int> Q;
    Q.push(S);
    while(!Q.empty())
    {
        int s=Q.front();
        Q.pop();
        for(int i=0;i<v[s].size();i++)
        {
            int e=v[s][i].e;
            if(dist[s]+v[s][i].w<dist[e])
            {
                dist[e]=dist[s]+v[s][i].w;
                Q.push(e);
            }
        }
    }
}
int DFS(int S)
{
    if(dp[S])
        return dp[S];
    if(S==2)
        return 1;
    for(int i=0;i<v[S].size();i++)
    {
        if(dist[v[S][i].e]<dist[S])
            dp[S]+=DFS(v[S][i].e);
    }
    return dp[S];
}
int main()
{
    int a,b,c;
    while(scanf("%d",&N)&&N)
    {
        v.clear();
        v.resize(N+1);
        memset(dp,0,sizeof(dp));
        scanf("%d",&M);
        while(M--)
        {
            scanf("%d%d%d",&a,&b,&c);
            v[a].push_back(node(b,c));
            v[b].push_back(node(a,c));
        }
        spfa(2);
        cout<<DFS(1)<<endl;
    }
    return 0;
}

  

时间: 2025-01-17 00:27:45

hdu1142(spfa+DFS记忆化)的相关文章

hdu 1501 Zipper (dfs+记忆化搜索)

Zipper Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6491    Accepted Submission(s): 2341 Problem Description Given three strings, you are to determine whether the third string can be formed

ZOJ 3644 Kitty&#39;s Game dfs,记忆化搜索,map映射 难度:2

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 从点1出发,假设现在在i,点数为sta,则下一步的点数必然不能是sta的因数,所以不会形成环,只需从1直接走,走到n即可. 但是如果这样的话时空复杂度就都是nk,明显不满足题意,而这个时候我们可以想到,每个状态都必然是k的约数,(点数不是k的约数的节点不在路上,可以无视),而约数的个数也就k^0.5个,可以直接用map映射,这样时空复杂度都是n*k^0.5,可以解出答案

HDU 5024 Wang Xifeng&#39;s Little Plot (枚举 + DFS记忆化搜索)

Wang Xifeng's Little Plot Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 513    Accepted Submission(s): 338 Problem Description <Dream of the Red Chamber>(also <The Story of the Stone>)

How many ways(dfs+记忆化搜索)

Problem Description 这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m).游戏的规则描述如下: 1.机器人一开始在棋盘的起始点并有起始点所标有的能量. 2.机器人只能向右或者向下走,并且每走一步消耗一单位能量. 3.机器人不能在原地停留. 4.当机器人选择了一条可行路径后,当他走到这条路径的终点时,他将只有终点所标记的能量. [center] [img]../../../data/images/C113-1003-1.gif[/img]

HDU 1484 Basic wall maze (dfs + 记忆化)

Basic wall maze Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 168    Accepted Submission(s): 52 Special Judge Problem Description In this problem you have to solve a very simple maze consisti

不要62 hdu 2089 dfs记忆化搜索

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意: 给你两个数作为一个闭区间的端点,求出该区间中不包含数字4和62的数的个数 思路: 数位dp中的 dfs 记忆化搜索方法解. 模板: int dfs(int i, int s, bool e) { if (i==-1) return s==target_s; if (!e && f[i][s] != -1) return f[i][s]; int res = 0; int u = e?

*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

poj1088滑雪(dfs+记忆化搜索、备忘录)

题目信息: Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.在上面的例子中,一条可滑

NYOJ skiing(DFS+记忆化搜索)

skiing 时间限制:3000 ms  |  内存限制:65535 KB 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 一个人可以从某个点