hdu_1026(最短路)
题意:最快出去的路径
题解:一看就是一个很简单的最短路,用优先队列写个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(最短路)的更多相关文章
- bzoj1001--最大流转最短路
http://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路:这应该算是经典的最大流求最小割吧.不过题目中n,m<=1000,用最大流会TLE, ...
- 【USACO 3.2】Sweet Butter(最短路)
题意 一个联通图里给定若干个点,求他们到某点距离之和的最小值. 题解 枚举到的某点,然后优先队列优化的dijkstra求最短路,把给定的点到其的最短路加起来,更新最小值.复杂度是\(O(NElogE) ...
- Sicily 1031: Campus (最短路)
这是一道典型的最短路问题,直接用Dijkstra算法便可求解,主要是需要考虑输入的点是不是在已给出的地图中,具体看代码 #include<bits/stdc++.h> #define MA ...
- 最短路(Floyd)
关于最短的先记下了 Floyd算法: 1.比较精简准确的关于Floyd思想的表达:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设maz ...
- bzoj1266最短路+最小割
本来写了spfa wa了 看到网上有人写Floyd过了 表示不开心 ̄へ ̄ 改成Floyd试试... 还是wa ヾ(。`Д´。)原来是建图错了(样例怎么过的) 结果T了 于是把Floyd改回spfa 还 ...
- HDU2433 BFS最短路
Travel Time Limit: 10000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 最短路(代码来源于kuangbin和百度)
最短路 最短路有多种算法,常见的有一下几种:Dijstra.Floyd.Bellman-Ford,其中Dijstra和Bellman-Ford还有优化:Dijstra可以用优先队列(或者堆)优化,Be ...
- Javascript优化细节:短路表达式
什么是短路表达式? 短路表达式:作为"&&"和"||"操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程 ...
- Python中三目计算符的正确用法及短路逻辑
今天在看别人代码时看到这样一种写法, 感觉是个挺容易踩到的坑, 搞清楚后写出来备忘. 短路逻辑 Python中进行逻辑运算的时候, 默认采用的是一种叫做短路逻辑的运算规则. 名字是很形象的, 下面直接 ...
随机推荐
- GitLab配置ssh key
一.背景 当前很多公司都选择git作为代码版本控制工具,然后自己公司搭建私有的gitlab来管理代码,我们在clone代码的时候可以选择http协议,当然我们亦可以选择ssh协议来拉取代码.但是网上很 ...
- Wincc flexable的IO域组态
1.题目 2.新建三个变量 3.组态画面,添加IO域1 1)常规设置 2)属性设置 4.组态IO域2 1)常规项 2)属性设置 5.组态第三个IO域 1)常规设置 2)属性设置 6.此外可以设置动画 ...
- 尝试在条件“$(_DeviceSdkVersion) >= 21”中对计算结果为“”而不是数字的“$(_DeviceSdkVersion)
晚上搞xamarin ,运行xamarin项目好好的,不知道怎么回事,一次运行xamarin android项目的时候,部署失败,以前也是遇到这样的错误. 尝试在条件"$(_DeviceSd ...
- js怎么防止变量冲突
[1]工程师甲编写功能A ? 1 2 3 var a = 1; var b = 2; alert(a+b);//3 [2]工程师乙添加新功能B ? 1 2 3 var a = 2; var b = 1 ...
- lesson - 4 笔记 /inode / suid / sgid / sbit / chmod /umask / chown / rwx / wc /grep / tr / sort / cut /which / whereis / locate / find / ln /
一.帮助+基本文件管理+用户管理 1.怎么查看命令帮助 ls --help man ls :查看命令/man 5 file:查看配置文件 二.基本文件管理,通过{查,建,删,改} 四个维度介绍了不同的 ...
- lesson - 1 - IP /DNS /cat !$ /putty 知识扩充
一.知识点扩充 1.嵌入式Linux 开发与运维 .安卓手机 . Linux真正的用武之地是蓬勃发展的信息接入设备市 场.这些新兴的设备只有有限的内存,价格也只有几百美元,因此开发者需要新的 ...
- SpringBoot_02_servlet容器配置
二.参考资料 1.Spring boot 自定义端口 2.Spring Boot的Web配置(九):Tomcat配置和Tomcat替换
- SpringMVC PathVariable和post、get、put、delete请求
1.PathVariable 可以映射URL中的占位符到目标方法的参数中. 2.Rest风格的URL 以CRUD为例: 新增:/order POST 修改:/order/id PUT 获取:/orde ...
- IE8及其以下浏览器关于圆角表框的问题
css部分 yuan { border: 2px solid #C0C0C0; -moz-border-radius: 50%; -webkit-border-radius: 50%; border- ...
- Python模块学习------ 多线程threading(1)
# Method 1: 创建一个Thread实例,传给它一个函数:import threading from time import sleep, ctime loops = [4,2] def lo ...