hdu1142 dijstra + 记忆化搜索

原创 2015年11月19日 20:13:03

题目难以理解,不过最后百度后才理解的大意,其中有一个关键的意思是,如果A到B直接相连,且从A到终点的最短路径大于从B到终点的最短路径,则该人可以从A走向B,问这样走下去,合法路径一共有多少。


直接贴代码,该题让我练习了一下dijkstra和记忆化搜索,说实话,记忆化搜索对于我来说,还真是硬伤。还得没事多练习下。


/*
His office is numbered 1,
and his house is numbered 2.
The first  N,
1 < N ≤ 1000,  M.
The following
M
1 ≤ d ≤ 1000000
There is at most one path between any pair of intersections.


Output
assume that this number does not exceed 2147483647

Sample Input
5 6
1 3 2
1 4 2
3 4 3
1 5 12
4 2 34
5 2 24
7 8
1 3 1
1 4 1
3 7 1
7 4 1
7 5 1
6 7 1
5 2 1
6 2 1
0


Sample Output
2
4

*/


#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
#include <utility> //pair头文件
#include <cstring>
#include <string>

using namespace std;

const int V_MAX = 1005;

typedef struct edge
{
    int to ,cost;
    edge(int a, int b){
        to = a;
        cost = b;
    }
}edge;
unsigned int dp[V_MAX];
int N,M;

vector<edge> G[V_MAX];
typedef pair<int, int > P;

const unsigned int INF = 1<<32 -1;

void cal_minpath(int s)
{
    for(int i=1; i<=N; i++)dp[i] = INF;
    dp[s] = 0;
    priority_queue<P, vector<P >,greater<P > > pque;
    pque.push(P(0,s));
    while(!pque.empty())
    {
        P temp = pque.top();
        pque.pop();
        int len = temp.first;
        int V = temp.second;
        if(len > dp[V])continue;
        for(int i=0;i<G[V].size(); i++)
        {
            int fir = G[V][i].to;
            int sec = G[V][i].cost;
            if(dp[fir] > dp[V]+sec)
            {
                dp[fir] = dp[V] + sec;
                pque.push(P(dp[fir], fir));
            }
        }
    }
}

int visited[V_MAX];
unsigned int sum[V_MAX];
unsigned int dfs(int s)
{
    if(sum[s]){return sum[s];}
    if(s == 2){return 1;}
    unsigned int psum = 0;
    for(int i=0; i<G[s].size(); i++)
    {
        edge e = G[s][i];
        if(dp[s] > dp[e.to])
        {
            if(sum[e.to])psum += sum[e.to];
            else psum += dfs(e.to);
        }
    }
    sum[s] = psum;
    return sum[s];
}


int main(){
    while(true)
    {
        int from,to,cost;
        memset(visited,0,sizeof(visited));
        memset(sum, 0, sizeof(sum));
        memset(G,0,sizeof(G));

        scanf("%d", &N);
        if(N == 0)break;
        scanf("%d", &M);
        for(int i=0; i<M; i++)
        {
            scanf("%d%d%d",&from, &to, &cost);
            G[from].push_back(edge(to,cost));
            G[to].push_back(edge(from,cost));
        }
        cal_minpath(2);
        cout << dfs(1) << endl;
    }
    return 0;
}


版权声明:虽然为本人原创,但是写得真是渣,想转就转,反正我也不是鸣人。

hdu1142(dijastra+记忆化搜索)

题目链接A Walk Through the Forest 记忆化搜索介绍 hdu1078 如果从B到home的路比任何从home到A的路要短,那么久有一条A从到B的路,计算一个可...
  • pmt123456
  • pmt123456
  • 2016年12月05日 19:49
  • 157

HDU1142:A Walk Through the Forest(Dijkstra+dfs)

Problem Description Jimmy experiences a lot of stress at work these days, especially since his acci...
  • libin56842
  • libin56842
  • 2013年12月11日 21:39
  • 1736

Dijstra算法 C++实现

Dijstra算法思想,简化版实现,:从源节点开始调整,相邻节点的最短距离。调整完之后,从距离最短并且没有作为u的节点中选取下一个节点 ,调整后面的节点,时间复杂度O(V*(V+E))。 #incl...
  • a2796749
  • a2796749
  • 2015年09月09日 16:23
  • 788

HDOJ1078 记忆化搜索入门题 有详细的记忆化搜索模板程序

FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth...
  • computer_user
  • computer_user
  • 2017年08月11日 10:18
  • 202

Dijstra算法的代码实现及解释(最短路径问题)

/*Dijstra 算法 实践 begin date:2015.3.19 end date:2015.3.19*/ #include using namespace std; const int m...
  • qq_21567903
  • qq_21567903
  • 2015年03月19日 20:57
  • 197

HDU1142

WA了好久,感觉WA率都因我而升。用了bellmon,dijkstra,以及dijkstra优化(偷偷说一下dijkstra到现在才会拼写),还没有使出必杀技SPFA.想了好久才知道原来源顶点为目的地...
  • cjsxjm
  • cjsxjm
  • 2015年05月20日 20:06
  • 233

记忆化搜索简介

记忆化搜索:算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存。 一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。 更重要的是搜索还可以剪枝,可能剪去...
  • ILECY
  • ILECY
  • 2016年03月12日 20:03
  • 2574

hdu1142 A Walk Through the Forest(spfa+记忆化搜索)

http://acm.hdu.edu.cn/showproblem.php?pid=1142 题意:n个点m个关系,起点是1,终点是2(家)。这里主人公每当选择路A到B时有一个要求:“if th...
  • Flynn_curry
  • Flynn_curry
  • 2016年10月19日 21:51
  • 102

单源最短路径Dijstra算法

Dijstra算法是寻找从某一顶点i出发到大其他顶点的最短路径。Distra算法的思想与Prim算法很像,它收录顶点的规则是按照路径长度递增的顺序收录的。设v0是源顶点,我们要寻找从v0出发到其他任意...
  • Tander_Tang
  • Tander_Tang
  • 2016年03月30日 23:00
  • 738

HDU1142——A Walk Through the Forest(spfa+记忆化搜索)

Jimmy experiences a lot of stress at work these days, especially since his accident made working dif...
  • WAR___NING
  • WAR___NING
  • 2015年07月31日 14:24
  • 317
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu1142 dijstra + 记忆化搜索
举报原因:
原因补充:

(最多只允许输入30个字)