HDU 1142 A Walk Through the Forest(Dijkstra+记忆化搜索)
题意:看样子很多人都把这题目看错了,以为是求最短路的条数。真正的意思是:假设 A和B 是相连的,当前在 A 处,
如果 A 到终点的最短距离大于 B 到终点的最短距离,则可以从 A 通往 B 处,问满足这种的条件的从办公室到家的路径条数。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #define inf 0x7fffffff
- int n,m,u,v,w;
- using namespace std;
- int g[][],dis[];
- int vis[],path[];
- void Dijkstra(int u)
- {
- memset(vis,,sizeof(vis));
- for(int i=;i<=n;i++)
- dis[i]=g[u][i];
- dis[u]=;
- vis[u]=;
- for(int i=;i<=n;i++){
- int k,min=inf;
- for(int j=;j<=n;j++){
- if(!vis[j]&&min>dis[j]){
- min=dis[j];
- k=j;
- }
- }
- vis[k]=;
- for(int j=;j<=n;j++){
- if(!vis[j]&&g[k][j]!=inf){//g[k][j]!=inf不能少
- if(dis[j]>dis[k]+g[k][j])
- dis[j]=dis[k]+g[k][j];
- }
- }
- }
- }
- int dfs(int u)
- {
- if(path[u]!=-) return path[u];
- if(u==) return ;//记忆化搜索,如果该点已经访问过了,就返回从该点到终点的路径数
- int num=;
- for(int v=;v<=n;v++){
- if(g[u][v]!=inf&&dis[v]<dis[u])
- num+=dfs(v);
- }
- path[u]=num;//不能直接return num,否则会TLE
- return path[u];
- }
- int main()
- {
- while(scanf("%d",&n),n){
- scanf("%d",&m);
- memset(path,-,sizeof(path));
- for(int i=;i<=n;i++){
- for(int j=;j<=n;j++)
- g[i][j]=(i==j?:inf);
- }
- for(int i=;i<=m;i++){
- scanf("%d%d%d",&u,&v,&w);
- if(g[u][v]>w)//处理重边
- g[u][v]=g[v][u]=w;
- }
- Dijkstra();
- cout<<dfs()<<endl;
- }
- return ;
- }
解法2:刚开始dfs中TLE,修改后就一直WA...至今缘由不明,还是太菜了
- #include<queue>
- #include<cstdio>
- #include<vector>
- #include<cstring>
- #define inf 0x7fffffff
- using namespace std;
- struct Node
- {
- int u,d;
- Node(long long uu,long long dd){
- u=uu,d=dd;
- }
- friend bool operator < (Node a,Node b){
- return a.d>b.d;
- }
- };
- struct Edge
- {
- int v,w;
- Edge(long long vv,long long ww){
- v=vv,w=ww;
- }
- };
- bool vis[];
- long long path[];
- vector<Edge> g[];//为Edge类型
- priority_queue<Node>que;//为Node类型
- long long dis[];
- void Dijkstra()
- {
- dis[]=;
- que.push(Node(,));
- while(!que.empty()){
- Node p=que.top();
- que.pop();
- long long u=p.u;
- if(!vis[u]){
- vis[u]=;//vis[u]=1位置不能放错
- for(int i=;i<g[u].size();i++){
- long long v=g[u][i].v;
- long long c=g[u][i].w;
- if(!vis[v]){//这里不能写vis[v]=1;
- if(dis[v]>dis[u]+c){
- dis[v]=dis[u]+c;
- que.push(Node(v,dis[v]));
- }
- }
- }
- }
- }
- }
- int dfs(int u)
- {
- if(path[u]!=-) return path[u];
- if(u==) return ;//找到终点,返回1条路
- long long num=;//注意num的位置
- for(int i=;i<g[u].size();i++){
- int v=g[u][i].v;
- if(dis[v]<dis[u])
- num+=dfs(v);
- }
- path[u]=num;
- return path[u];//返回从u到终点的所有路径数
- }
- int main()
- {
- long long n,m,u,v,w;
- while(scanf("%lld",&n),n){
- scanf("%lld",&m);
- memset(g,,sizeof(g));//切记清零
- memset(vis,,sizeof(vis));
- for(int i=;i<=n;i++) dis[i]=inf;
- for(int i=;i<=m;i++){
- scanf("%lld%lld%lld",&u,&v,&w);
- g[u].push_back(Edge(v,w));
- g[v].push_back(Edge(u,w));
- }
- Dijkstra();
- memset(path,-,sizeof(path));//初始化
- printf("%lld\n",dfs());
- }
- }
HDU 1142 A Walk Through the Forest(Dijkstra+记忆化搜索)的更多相关文章
- HDU 1142 A Walk Through the Forest(dijkstra+记忆化DFS)
题意: 给你一个图,找最短路.但是有个非一般的的条件:如果a,b之间有路,且你选择要走这条路,那么必须保证a到终点的所有路都小于b到终点的一条路.问满足这样的路径条数 有多少,噶呜~~题意是搜了解题报 ...
- 题解报告:hdu 1142 A Walk Through the Forest
题目链接:acm.hdu.edu.cn/showproblem.php?pid=1142 Problem Description Jimmy experiences a lot of stress a ...
- HDU1142 (Dijkstra+记忆化搜索)
A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- 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 ...
- 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 ...
- HDU 4444 Walk (离散化建图+BFS+记忆化搜索) 绝对经典
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4444 题意:给你一些n个矩形,给你一个起点,一个终点,要你求从起点到终点最少需要转多少个弯 题解:因为 ...
- 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 (求最短路条数)
A Walk Through the Forest 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1142 Description Jimmy exp ...
- 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 ...
随机推荐
- debugging openstack with pdb
在要开始debug的地方导入pdb: class KeypairAPI(base.Base): """Sub-set of the Compute Manager API ...
- 表达式树在LINQ动态查询
动态构建表达式树,最佳实践版,很实用! public class FilterCollection : Collection<IList<Filter>> { public F ...
- stringstream类操作字符串流
C++ Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...
- DM8168 OpenCV尝试与评估(编译ARM版OpenCV)
交叉编译opencv2.3.1,并在DM8168 cortex A8中执行图像处理. 开发环境: PC:ubuntu12.04LTS.Intel Core 2 Duo CPU E7200@2. ...
- Android popupwindow 演示样例程序一
经过多番測试实践,实现了popupwindow 弹出在指定控件的下方.代码上有凝视.有须要注意的地方.popupwindow 有自已的布局,里面控件的监听实现都有.接下来看代码实现. 项目资源下载:点 ...
- linux命令之rpm
1.查询一个包是否被安装的命令rpm -q < rpm package name> 2.列出所有被安装的rpm package 命令rpm -qa
- Spring学习笔记--使用Spring基于Java的配置
我们需要使用@Component注解来定义一个配置类,在配置类中我们定义Bean: package com.moonlit.myspring; import org.springframework.c ...
- log4j2设置日志文件读写权限(filePermissions)
spring-boot使用log4j2作为日志插件的时候需要设置日志文件的读写权限,可以File 上增加filePermissions,如: <File name="File" ...
- Excel宏被禁用解决办法
- Objective-C代码学习大纲(4)
2011-05-11 14:06 佚名 otierney 字号:T | T 本文为台湾出版的<Objective-C学习大纲>的翻译文档,系统介绍了Objective-C代码,很多名词为台 ...