poj 2662(Dijkstra+记忆化)
题目链接:http://poj.org/problem?id=2662
思路:首先路径的选择,如果B点到终点的距离比A点到终点的最短距离短,那么就从A走到B,换句话说,就是每次都是择优选择更靠近终点的点。于是我们可以从终点2跑一次Dijkstra,求出每个点到终点的最短距离,然后就是从起点1开始记忆化搜索,如果满足上面条件的,就dfs.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define MAXN 1111
#define inf 1<<30 struct Edge{
int v,w;
Edge(int vv,int ww):v(vv),w(ww){}
}; int n,m;
int dist[MAXN];
bool mark[MAXN];
int dp[MAXN]; vector<vector<Edge> >G;
void Dijkstra(int st)
{
memset(mark,false,sizeof(mark));
fill(dist,dist+n+,inf);
dist[st]=;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >que;
que.push(make_pair(,st));
while(!que.empty()){
int u=que.top().second,dd=que.top().first;
que.pop();
if(mark[u])continue;
mark[u]=true;
for(int i=;i<G[u].size();i++){
int v=G[u][i].v,w=G[u][i].w;
if(mark[v])continue;
if(dd+w<dist[v]){
dist[v]=dd+w;
que.push(make_pair(dist[v],v));
}
}
}
} int dfs(int u)
{
if(u==)return ;
if(dp[u])return dp[u];
for(int i=;i<G[u].size();i++){
int v=G[u][i].v,w=G[u][i].w;
if(dist[v]<dist[u]){
dp[u]+=dfs(v);
}
}
return dp[u];
} int main()
{
int u,v,w;
while(~scanf("%d",&n)&&n){
scanf("%d",&m);
G.clear();
G.resize(n+);
while(m--){
scanf("%d%d%d",&u,&v,&w);
G[u].push_back(Edge(v,w));
G[v].push_back(Edge(u,w));
}
Dijkstra();
memset(dp,,sizeof(dp));
printf("%d\n",dfs());
}
return ;
}
poj 2662(Dijkstra+记忆化)的更多相关文章
- HDU1142 (Dijkstra+记忆化搜索)
A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- POJ 1088 滑雪 (记忆化搜索)
题目链接:http://poj.org/problem?id=1088 题意很好懂,就是让你求一个最长下降路线的长度. dp[i][j]记录的是i j这个位置的最优的长度,然后转移方程是dp[i][j ...
- luogu3953 [NOIp2017]逛公园 (tarjan+dijkstra+记忆化搜索)
先跑一边dijkstra算出从1到i的最短距离dis[i] 然后建反向边 从n开始记忆化搜索,(p,k)表示1到p的距离=dis[p]+k的方案数 答案就是$\sum\limits_{i=0}^{k} ...
- HDU 1142 A Walk Through the Forest(Dijkstra+记忆化搜索)
题意:看样子很多人都把这题目看错了,以为是求最短路的条数.真正的意思是:假设 A和B 是相连的,当前在 A 处, 如果 A 到终点的最短距离大于 B 到终点的最短距离,则可以从 A 通往 B 处,问满 ...
- POJ 1088 滑雪 记忆化DP
滑雪 Time Limit: 1000MS Memory Limit: 65536K Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度 ...
- POJ 1088 滑雪 记忆化优化题解
本题有人写是DP,只是和DP还是有点区别的,应该主要是记忆化 Momoization 算法. 思路就是递归,然后在递归的过程把计算的结果记录起来,以便后面使用. 非常经典的搜索题目,这样的方法非常多题 ...
- Luogu 3953[NOIP2017] 逛公园 堆优化dijkstra + 记忆化搜索
题解 首先肯定是要求出单源最短路的,我用了堆优化dijikstra ,复杂度 mlogm,值得拥有!(只不过我在定义优先队列时把greater 打成了 less调了好久 然后我们就求出了$i$到源点的 ...
- POJ 1088 DP=记忆化搜索
话说DP=记忆化搜索这句话真不是虚的. 面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦! 通过对四 ...
- HDU 1142 A Walk Through the Forest(dijkstra+记忆化DFS)
题意: 给你一个图,找最短路.但是有个非一般的的条件:如果a,b之间有路,且你选择要走这条路,那么必须保证a到终点的所有路都小于b到终点的一条路.问满足这样的路径条数 有多少,噶呜~~题意是搜了解题报 ...
随机推荐
- python——python 数据结构之双向链表的实现
和单链表类似,只不过是增加了一个指向前面一个元素的指针而已. 示意图: python 实现代码: #Personal Python Data Structure--PPDS # #!/usr/bin/ ...
- visio 画图工具
1.线条 [设计] --- [页面设置]----打开 对话框 [布局与排列]-----[排列] ---- [样式] --- [直 2.word中插入viso 插入→对象→visio
- C#中怎样获取当前路径的几种方法
String apppath = System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase; //获取整个文件路径名 a ...
- java 学习总结
1 cobertura-maven-plugin maven的测试覆盖率插件集成cobertura-maven-plugin2 intelli J 配置VM参数 3 配置显示行号 mvn clean ...
- struts 类型转换器
类型转换 (来自尚学堂) a) 默认转换 i. 日期处理 b) 写自己的转换器: public class MyPointConverter extends Defau ...
- Nginx视频流模块nginx-rtmp-module
文章参考地址:https://www.cnblogs.com/tinywan/p/6202345.html nginx-rtmp-module:https://github.com/arut/ngin ...
- vue结合Promise及async实现高效开发。
在vue中平时的开发中我们应该都会遇到promise函数,比如我们常用的axios,resource这都是用来做http请求的插件. 在平时的开发里,关于axios我们可能是这样写的 import a ...
- Eclipse - JAR包制作
Eclipse - JAR包制作细节 1.Jar包分为两种,一种是不可运行的,一种是可运行的Jar包,他们的主要区别如下: > 不可直接运行的Jar包主要是用于给别的程序提供调用 ...
- LNMP架构二
Nginx默认虚拟主机 1.首先修改nginx.conf文件,删除server及下面的,在http最后添加include vhost/*.conf; (指定虚拟主机目录,并读取以.conf结尾的文件) ...
- 浅谈 Objective-C 下对象的初始化
转自:http://www.oschina.net/question/54100_32468 众所周知,Objective-C是一门面向对象的语言,一般情况下,我们在Objective-C中定义一个类 ...