# hdu1142 dijstra + 记忆化搜索

/*
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+记忆化搜索)

• 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
• 2013年12月11日 21:39
• 1736

## Dijstra算法 C++实现

Dijstra算法思想，简化版实现，：从源节点开始调整，相邻节点的最短距离。调整完之后，从距离最短并且没有作为u的节点中选取下一个节点 ，调整后面的节点，时间复杂度O（V*(V+E)）。 #incl...
• 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
• 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
• 2015年03月19日 20:57
• 197

## HDU1142

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

## 记忆化搜索简介

• 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
• 2016年10月19日 21:51
• 102

## 单源最短路径Dijstra算法

Dijstra算法是寻找从某一顶点i出发到大其他顶点的最短路径。Distra算法的思想与Prim算法很像，它收录顶点的规则是按照路径长度递增的顺序收录的。设v0是源顶点，我们要寻找从v0出发到其他任意...
• 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
• 2015年07月31日 14:24
• 317

举报原因： 您举报文章：hdu1142 dijstra + 记忆化搜索 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)