题意:最快出去的路径

题解:一看就是一个很简单的最短路,用优先队列写个spfa就过了,但是没想到水了个(n*n)^2的算法也过了。。。愿意很简单,因为是个稀疏图

敲完以后一百度发现就是个简单的bfs+优先队列其实思路是一样的,每次选出不在路径中距离路径最短的边,因为这个更新的时候只能更新其周围的四个点,那个吗。。。懒得打了,。。。记得提醒我有时间打一下。。。。

代码:转化成图后,单源最短路求到n*m-1就可以了,完美

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = ;
#define INF 0x1fffffff
char mp[N][N];
int dist[N*N];
bool p[N*N];
int head[N*N];
struct Edge{
int to;
int next;
int w;
}edge[N*N*];
int Ecnt;
void init()
{
Ecnt = ;
memset(head,-,sizeof(head));
} void printTree(int n, int m){
for(int i = ; i < n*m; i++) {
printf("%d: ", i);
for(int j = head[i]; j != -; j = edge[j].next) {
printf("to = %d w = %d", edge[j].to,edge[j].w);
}
puts("");
}
} void add(int from, int to, int w){
edge[Ecnt].to = to;
edge[Ecnt].w = w;
edge[Ecnt].next = head[from];
head[from]=Ecnt++;
}
int go[][] = {{,},{-,},{,},{,-}};
bool in(int x,int y,int n, int m){
if(x<n&&x>=&&y<m&&y>=) return true;
else return false;
}
int ans[N*N];
int fa[N*N];
int sum[N*N];
void f(int n, int m){
int t = ;
int tm = n*m-;
sum[t++] = n*m-;
while(fa[tm]!=){
sum[t++] = fa[tm];
tm = fa[tm];
}
for(int i = t-; i >= ; i--){
ans[t-i] = sum[i];
}
}
int Count;
void dijk(int s, int n)
{ int i , j , k ;
Count = ;
for(i = ;i <= n ;i++)
{
p[i] = false;
dist[i] = INF;
}
//p[s] = true;
dist[s] = ; for( i = ; i < n ; i++)
{
int Min = INF ;
k = ;
for( j = ; j < n ; j++)
{
if(!p[j]&&dist[j]<Min)
{
Min = dist[j];
k = j;
}
} if(Min == INF) return ;
p[k] = true;
//printf("k = %d\n",k);
for(j = head[k]; j != - ; j = edge[j].next)
{
Edge e = edge[j];
if(!p[e.to]&&dist[e.to]>dist[k]+e.w){
dist[e.to] = dist[k]+e.w;
fa[e.to] = k;
}
}
}
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i = ; i < n; i++){
scanf("%s",&mp[i]);
}
int id;
init();
for(int i = ; i < n; i++){
for(int j = ; j < m; j++){
id = i*m+j;
for(int k= ; k < ; k++){
int tx = i+go[k][];
int ty = j+go[k][];
int tid = tx*m+ty;
if(in(tx,ty,n,m)){
if(mp[tx][ty]=='.') add(id,tid,);
else if(mp[tx][ty]=='X');//add(id,tid,INF);
else add(id,tid,mp[tx][ty]-''+);
}
}
}
}
// printTree(n,m);
int cnt = ;
int c = (n)*(m);
dijk(,c);
f(n,m); int t = ;
if(dist[c-]==INF) {
printf("God please help our poor hero.\nFINISH\n");
continue;
}
printf("It takes %d seconds to reach the target position, let me show you the way.\n",dist[c-]);
for(int i = ;cnt <= dist[c-] ; i++){
int sx,sy,dx,dy;
sx = ans[t]/(m);
sy = ans[t++]%(m);
dx = ans[t]/(m);
dy = ans[t]%(m);
printf("%ds:(%d,%d)->(%d,%d)\n",cnt++,sx,sy,dx,dy);
if(mp[dx][dy]!='.') {
for(int i = ; i < (mp[dx][dy]-'');i++)
printf("%ds:FIGHT AT (%d,%d)\n",cnt++,dx,dy);
}
}
puts("FINISH");
}
return ;
}

hdu_1026(最短路)的更多相关文章

  1. bzoj1001--最大流转最短路

    http://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路:这应该算是经典的最大流求最小割吧.不过题目中n,m<=1000,用最大流会TLE, ...

  2. 【USACO 3.2】Sweet Butter(最短路)

    题意 一个联通图里给定若干个点,求他们到某点距离之和的最小值. 题解 枚举到的某点,然后优先队列优化的dijkstra求最短路,把给定的点到其的最短路加起来,更新最小值.复杂度是\(O(NElogE) ...

  3. Sicily 1031: Campus (最短路)

    这是一道典型的最短路问题,直接用Dijkstra算法便可求解,主要是需要考虑输入的点是不是在已给出的地图中,具体看代码 #include<bits/stdc++.h> #define MA ...

  4. 最短路(Floyd)

    关于最短的先记下了 Floyd算法: 1.比较精简准确的关于Floyd思想的表达:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设maz ...

  5. bzoj1266最短路+最小割

    本来写了spfa wa了 看到网上有人写Floyd过了 表示不开心 ̄へ ̄ 改成Floyd试试... 还是wa ヾ(。`Д´。)原来是建图错了(样例怎么过的) 结果T了 于是把Floyd改回spfa 还 ...

  6. HDU2433 BFS最短路

    Travel Time Limit: 10000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  7. 最短路(代码来源于kuangbin和百度)

    最短路 最短路有多种算法,常见的有一下几种:Dijstra.Floyd.Bellman-Ford,其中Dijstra和Bellman-Ford还有优化:Dijstra可以用优先队列(或者堆)优化,Be ...

  8. Javascript优化细节:短路表达式

    什么是短路表达式? 短路表达式:作为"&&"和"||"操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程 ...

  9. Python中三目计算符的正确用法及短路逻辑

    今天在看别人代码时看到这样一种写法, 感觉是个挺容易踩到的坑, 搞清楚后写出来备忘. 短路逻辑 Python中进行逻辑运算的时候, 默认采用的是一种叫做短路逻辑的运算规则. 名字是很形象的, 下面直接 ...

随机推荐

  1. 谷歌浏览器插件-jsonView插件安装与使用

    本文转载:http://www.bubuko.com/infodetail-700647.html 1 安装 1.打开 https://github.com : 2.搜索 jsonView 链接:ht ...

  2. JPA的基本使用

    前提: 创建一个springboot项目 创建一个名为springboottest的MySQL数据库 1 jar包准备 jpa的jar包 mysql驱动的jar包 druid数据库连接池的jar包 l ...

  3. bzoj 3712: [PA2014]Fiolki

    Description 化学家吉丽想要配置一种神奇的药水来拯救世界.吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[i]克的第i种物质.吉丽需要执行一定的步骤来配置药 ...

  4. bzoj 4817: [Sdoi2017]树点涂色

    Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...

  5. PredictionIO+Universal Recommender快速开发部署推荐引擎的问题总结(3)

    PredictionIO+Universal Recommender虽然可以帮助中小企业快速的搭建部署基于用户行为协同过滤的个性化推荐引擎,单纯从引擎层面来看,开发成本近乎于零,但仍然需要一些前提条件 ...

  6. ffmpeg常用命令---转

    1.分离视频音频流 ffmpeg -i input_file -vcodec copy -an output_file_video //分离视频流 ffmpeg -i input_file -acod ...

  7. Fragment生命周期及实现点击导航图片切换fragment,Demo

    PS:Fragment简介 Fragment是Android3.0后引入的一个新的API,他出现的初衷是为了适应大屏幕的平板电脑, 当然现在他仍然是平板APP UI设计的宠儿,而且我们普通手机开发也会 ...

  8. MySQL5.6中date和string的转换和比较

    Conversion & Comparison, involving strings and dates in MySQL 5.6 我们有张表,表中有一个字段dpt_date,SQL类型为da ...

  9. mysql 数据表字段修改sql 语句

    1 新增字段 alter table bulletin add citycode varchar(6) not null default 0 [after `id`]; # 城市代码 2 修改字段 a ...

  10. linux编译php gd扩展

    1 安装gd的依赖包 yum -y install gd gd2 gd-devel gd2-devel zlib freetype 2 安装jpeg: wget http://www.ijg.org/ ...