HDNOIP201404最短路径
难度级别: A; 编程语言:不限;运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
试题描述

a、b、c是3个互不相等的1位正数,用它们和数字0可以填满一个n行n列的方格阵列,每格中都有4种数码中的一个。填入0的格子表示障碍物,不能属于任何路径。你是否能找出一条从1行1列出发,到达n行n列且代价最小的路径呢?注意:每一格只能走向与之相邻的上、下、左、右的非0且不出界的格子。而所谓路径代价指的是路径经过的所有格子中的数字总和。请你编程求出从1行1列的位置出发到达n行n列的最小路径代价,若无法到达就输出-1。

输入
第一行输入数字n。
接下来的n行每行是一个长度为n的数字串,这n个字符串就构成了一个数字符的方阵。方阵中除了'0'外,最多还可以包含3种数字符。
输出
仅有最小代价或-1这一个整数。
输入示例
【输入样例1】
4
1231
2003
1002
1113
【输入样例2】
4
3150
1153
3311
0530
输出示例
【输出样例1】
10
【输出样例2】
-1
其他说明
60%的数据,n<10,80%的数据,n<100,100%的数据,n<1000

题解:好题呀。

一看题就知道普通的最短路不行,那么就要注意到题目的特殊条件:边权是基本确定的。

然后就变成一眼题了:用dij的f递增的思想,窝萌维护几个单调队列就行了。然后就只是O(n^2)的辣。

单调队列的题真是优美啦啦啦~

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
using namespace std;
const int maxn=+,inf=-1u>>,u[]={-,,,},v[]={,,-,};
struct par{int x,y;par(int _x=,int _y=){x=_x;y=_y;}};
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') sig=-;ch=getchar();}
while(isdigit(ch)) x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<) putchar('-'),x=-x;
int len=,buf[];while(x) buf[len++]=x%,x/=;
for(int i=len-;i>=;i--) putchar(buf[i]+'');return;
}
queue<par>q[];char a[maxn][maxn];int n,z,b[],f[maxn][maxn];
int minq(){
int r=;
if(!q[].empty()) r=;
if(!q[].empty()&&f[q[].front().x][q[].front().y]<f[q[r].front().x][q[r].front().y]) r=;
if(!q[].empty()&&f[q[].front().x][q[].front().y]<f[q[r].front().x][q[r].front().y]) r=;
return r;
}
void init(){
memset(f,-,sizeof(f));n=read();
for(int i=;i<=n;i++)scanf("%s",a[i]+);
if(a[][]==''||a[n][n]==''){write(-);return;}
q[].push(par(,));f[][]=inf;
b[a[][]-'']=++z;
q[].push(par(,));f[][]=a[][]-'';
while(f[n][n]<&&!(q[].empty()&&q[].empty()&&q[].empty())){
int k=minq(),x=q[k].front().x,y=q[k].front().y;q[k].pop();
for(int d=;d<;d++){
int i=x+u[d],j=y+v[d];
if(a[i][j]>''&&f[i][j]<){
int c=a[i][j]-'';
if(!b[c]) b[c]=++z;
k=b[c];
q[k].push(par(i,j));
f[i][j]=f[x][y]+c;
}
}
}write(f[n][n]);
return;
}
void work(){
return;
}
void print(){
return;
}
int main(){init();work();print();return ;}

COJ 0244 HDNOIP201404最短路径的更多相关文章

  1. HDNOIP201404最短路径

    HDNOIP201404最短路径 难度级别: A: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 a.b.c是3个互不相等的1 ...

  2. Johnson 全源最短路径算法

    解决单源最短路径问题(Single Source Shortest Paths Problem)的算法包括: Dijkstra 单源最短路径算法:时间复杂度为 O(E + VlogV),要求权值非负: ...

  3. Floyd-Warshall 全源最短路径算法

    Floyd-Warshall 算法采用动态规划方案来解决在一个有向图 G = (V, E) 上每对顶点间的最短路径问题,即全源最短路径问题(All-Pairs Shortest Paths Probl ...

  4. Dijkstra 单源最短路径算法

    Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...

  5. Bellman-Ford 单源最短路径算法

    Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法.该算法由 Richard Bellman 和 Leste ...

  6. 最短路径算法-Dijkstra

    Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法. 所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径. 以python代码为例,实现Dijkstra算法 1.数据 ...

  7. bzoj 4016: [FJOI2014]最短路径树问题

    bzoj4016 最短路路径问题 Time Limit: 5 Sec Memory Limit: 512 MB Description 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点 ...

  8. 51nod 1459 迷宫游戏 (最短路径—Dijkstra算法)

    题目链接 中文题,迪杰斯特拉最短路径算法模板题. #include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f ],v ...

  9. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

随机推荐

  1. I have a dream

    1.金斧子 2.有利网 3.金融街

  2. Eclipse(MyEclipse)使用技巧——改动凝视字体大小

    Eclipse在安装完毕后,凝视的字体大小远远小于代码的大小,依照网上查的相关信息 窗体--首选项--常规--外观--颜色和字体--基本--文本字体--编辑 Window -->Preferen ...

  3. Oracle&#39;s Business Intelligence Applications Configuration Manager 基本概念

    Oracle's Business Intelligence Applications Configuration Manager :BIACM Once the BIAPPS installatio ...

  4. STL之deque双向队列

    deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,提供随机访问,deque在接口上和vector非常相似,下面列出deque的常用成员函数: Table 6.9. C ...

  5. nyoj 2

    #include <iostream> #include <stack> #include <string.h> #include <stdio.h> ...

  6. JY03-HTML/CSS-京东03

  7. return;,return false,return true----------浅析

    作为新手,一直没注意他们的区别,今天特意在网上搜了搜. 1: retuen; 无返回值,表示终止函数往下执行 2: return true; a.返回 bool值 真 b.提交表单 针对<but ...

  8. CSS中伪类的使用

    原文:http://www.cnblogs.com/guopei/archive/2011/04/16/2017627.html 何为伪类? 也就是实际实现了类的效果,但是并没有实际添加到标签中的类, ...

  9. sql server 导出

    http://ssat.codeplex.com/SourceControl/latest 用于连接sql server

  10. [转]MySQL数据库的热备份

    一.系统环境描述:      1.两台数据库服务器,A和B:      2.当前A正在使用,将作为主服务器,B为准备用来做备用数据库服务器:      3.要进行热备份的数据库中含有类型为MyISAM ...