题意:最快出去的路径

题解:一看就是一个很简单的最短路,用优先队列写个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. bzoj 1566: [NOI2009]管道取珠

    Description   Input 第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型.其中A表示浅色球,B表示深色球. ...

  2. openstack操作之二 restful api

    Restful api 是openstack各服务调用的接口,简单理解为可以通过网络去调用的函数.postman是一款前端调用工具,测试后端接口的时候往往是使用该工具去验证.在openstack的使用 ...

  3. 使用CSS画图之三角形(一)

    简单的画一个三角形,代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  4. ProjectA: 多元非线性回归

    https://www.youtube.com/watch?v=n9XycstdPYs&t=907s

  5. Oracle12c_安装1——准备工作

    1.建议用户和组 su root #切换到root groupadd oinstall #创建用户组oinstall groupadd dba #创建用户组dba useradd -g oinstal ...

  6. js把通过图片路径生成base64

    主要思想: 使用canvas.toDataURL()方法将图片的绝对路径转换为base64编码. 一.图片在本地服务器: var imgSrc = "img/1.jpg";//本地 ...

  7. MFC鼠标单击截获鼠标双击事件,且无法记录单击的数据的解决方案

    遇到的问题: 鼠标点击会截断鼠标双击的事件,无法保存椭圆的数据.也就是说双击执行的过程是OnLButtonDown,OnLButtonUp,OnLButtonDblClk,OnLButtonUp.并不 ...

  8. jQuery Ajax post多个值传参

    http://blog.csdn.net/wang8559422/article/details/42394839 data:'id='+data+'&val='+val   加&符 ...

  9. ADO.NET访问数据库

    1:ADO.NET数据库的方法和技术 2:ADO.NET的主要组成: 1>DataSet(数据集)-----独立于数据间的数据访问 2>.NETFramework(数据提供程序)----- ...

  10. Python并发实践_03_并发实战之一

    16S数据质控流程,一次下机lane包括很多的项目,每个项目有独立的合同号,一个项目可能包含16S或者ITS两种,通过一个完整的pipeline,将上游拆分好的数据全部整理成可以直接分析的数据.原本这 ...