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中进行逻辑运算的时候, 默认采用的是一种叫做短路逻辑的运算规则. 名字是很形象的, 下面直接 ...
随机推荐
- 代码生成利器:IDEA 强大的 Live Templates(转)
代码生成利器:IDEA 强大的 Live Templates - 文章 - 伯乐在线http://blog.jobbole.com/110607/ 前言 Java 开发过程经常需要编写有固定格式的代码 ...
- 小白的 MySQL 笔记(一)
来自 stackoverflow 的内容居多. 1- MySQL VARCHAR size? 2- 数据库设计范式 3- What is InnoDB and MyISAM in MySQL ? 4- ...
- css3 UI元素状态伪类选择器
选择器 说明 例子/备注 E:hover 当鼠标移到元素上元素所使用的样式 :hover{}或input:[type="text"]:hover{} E:active 当元素被激活 ...
- 封装简单的equery
/** * Created by wang on 2016/3/23. */ //绑定操作 function bindEvent(obj,events,fn){ if (obj.addEventLis ...
- C# winForm资源文件实现多语言切换
这是我目前看到过最简单的多语言切换了 操作步驟 介面上的多語 Step1.將表單的Localizable屬性設為True Step2.切換表單的Language屬性為欲使用的語系 設完後會在分頁標籤上 ...
- vue-router源码学习(一)
因为v3.01版本中的 /src代码使用TypeScript进行书写,我这里仅仅用作模块学习, 具体学习的还是 /dist/vue-router.js 代码. (一)基本使用方式 JS代码 // ...
- Vue 爬坑之路(七)—— 监听滚动事件 实现动态锚点
前几天做项目的时候,需要实现一个动态锚点的效果 如果是传统项目,这个效果就非常简单.但是放到 Vue 中,就有两大难题: 1. 在没有 jQuery 的 animate() 方法的情况下,如何实现平滑 ...
- (python)leetcode刷题笔记03 Longest Substring Without Repeating Characters
3. Longest Substring Without Repeating Characters Given a string, find the length of the longest sub ...
- 一秒搞定mysql的远程登录
执行下面命令! mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mypw' WITH GRANT OPTION ; ...
- 《vue.js2.0从入门到放弃》学习之路
原文地址: Vue.js2.0从入门到放弃---入门实例(一):http://blog.csdn.net/u013182762/article/details/53021374 Vue.js2.0从入 ...