题意:最快出去的路径

题解:一看就是一个很简单的最短路,用优先队列写个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. android测试

    1.测试是否知道源代码: --黑盒测试 不知道代码 --白盒测试 知道源代码 2.按照测试粒度: --方法测试 --单元测试 Junit测试 --集成测试 --系统测试 3.按照测试暴力程度 --冒烟 ...

  2. 深入理解用户权限rwx

    其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是1,表示有相应的权限,如果是0则没有相应权限第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于 ...

  3. windows 下的python 安装pycrypto

    一般在官方网站下载pycrypto: https://www.dlitz.net/software/pycrypto/   然后使用命令就可以安装成功了: python setup.py build  ...

  4. 【http转https】其之三 IIS_URL重写_http重定向到https

    IIS_URL重写_http重定向到https 文:铁乐猫 2016年1月14日 IIS7以上支持URL Rewrite这个模块了,所以在我们做好了ssl证书这一块之后, 要对来自http的请求重定向 ...

  5. 部署github开源软件遇到的问题

    jdk1.8源版本不一样: 将语言级别改为8,所有的jdk都配置为1.8 2. 遇到一些解析错误 应该是tomcat的jdk版本和项目的jdk版本不一样

  6. windows server数据库备份

    @echo off //设置生成文件名字 set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%"//使用mysqldump输出sql文件 cesec ...

  7. javascript字符串与数组转换汇总

    本文给大家分享的是Js中字符串转换成数组,数组转换成字符串的函数,十分的简单实用,有需要的小伙伴可以参考下. 数组转字符串 1.join()方法 ? 1 2 3 4 var s= ["a&q ...

  8. 【JavaScript 】for 循环进化史

    ECMAScript 6已经逐渐普及,经过二十多年的改进,很多功能也有了更成熟的语句,比如 for 循环 这篇博客将介绍一下从最初的 for 循环,到 ES6 的 for-of 等四种遍历方法 先定义 ...

  9. Python day 6(3) Python 函数式编程1

    一:函数式编程概念 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的 ...

  10. Java第二章----对象和类

    从第一章到第二章整整隔了一个月的时间,这速度也是慢的无语了.因为这个月负责开发公司一个SaaS类型APP,忙的昏天暗地终于上线了,这才有时间写个博客.本章还是以概念为主,有点枯燥重在理解. 第一节:对 ...