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 ...
随机推荐
- jQuery对象与javaScript对象的互换
1. jQuery对象-->Dom对象 1) 通过 .[0] 的方式: var $s = $(.class); (jQuery对象) var s = $s.[0]; ...
- FragmentStatePagerAdapter写法
为了节省资源,分批加载数据//适配器class TabLayoutViewPagerAdapter extends FragmentStatePagerAdapter { public TabLayo ...
- 【黑金原创教程】【TimeQuest】【第二章】TimeQuest模型角色,网表概念,时序报告
声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...
- python中的各种符号
在这里所作的是将所有的 Python 符号和关键字列出来,这些都是值得掌握的重点. 关键字 and del from not while as elif global ...
- 【BZOJ2783】[JLOI2012]树 DFS+栈+队列
[BZOJ2783][JLOI2012]树 Description 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节 ...
- android 开发 - 结束所有activity
每一个activity都有自己的生命周期,被打开了最终就要被关闭. 四种结束当前的activity方法 //关闭当前activity方法一 finish(); //关闭当前界面方法二 android. ...
- C 语言开发初涉-01 简单学习
尝试用C语言写windows程序: 简单的计算器 1.0版,仅用来熟悉C 开发windows的一些语法和语句用法 #include "stdafx.h" #include < ...
- Zabbix高可用
上一篇:Zabbix数据库表结构 安装两台Zabbix-server 两台均安装MySQL数据库 数据库做双主互相同步 keepalive做vip偏移 to_master.sh脚本 两边都要安装ssh ...
- postfix邮箱服务器修改附件大小限制遇到的问题与解决
Q1:邮件大小限制为30M,发送的附件大小为25M,发送后提示邮件大小超过限制 A:邮箱客户端在发送邮件时会把附件进行base64转码,转码之后邮件大小会超过附件+正文的大小,所以10M的附件在经过转 ...
- 随笔 javascript-抽象工厂模式
随笔 javascript-抽象工厂模式 抽象工厂模式笔记 1.抽象工厂模式创建多个抽象类,创建出的结果是一个类簇(这里是抽象类的集合) 2.抽象工厂中传入的父类是否是抽象工厂方法创建的抽 ...