HDNOIP201404最短路径
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
|
确实是一道好题。
1000*1000的最短路可能有些吃力,实测卡时1000s+。那么怎么做呢?
方阵中除了'0'外,最多还可以包含3种数字符。
这提醒我们,可以在这上面做些文章。考虑为什么用Heap来优化Dijkstra,是因为有些边很长有些边很短,对于所有入边相同的点,易得它们的距离是递增的。
算法就水落石出了,用3个单调队列代替Heap,注意每次如何取队头和如何加入队尾。
- #include<cstdio>
- #include<cctype>
- #include<queue>
- #include<cstring>
- #include<algorithm>
- #define rep(i,s,t) for(int i=s;i<=t;i++)
- #define ren for(int i=first[x];i!=-1;i=next[i])
- using namespace std;
- inline int read() {
- int x=,f=;char c=getchar();
- for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
- for(;isdigit(c);c=getchar()) x=x*+c-'';
- return x*f;
- }
- const int maxn=;
- char A[maxn][maxn];
- int n,d[maxn][maxn],vis[maxn][maxn],idx[maxn],tp;
- struct Point {
- int x,y;
- bool operator < (const Point& ths) {return d[x][y]<d[ths.x][ths.y];}
- };
- queue<Point> q[];
- int getfront() {
- int c=-;
- if(q[].size()) c=;
- if(q[].size()&&(c<||q[].front()<q[c].front())) c=;
- if(q[].size()&&(c<||q[].front()<q[c].front())) c=;
- return c;
- }
- int mx[]={,-,,},my[]={,,,-};
- int solve() {
- if(A[][]==''||A[n][n]=='') return -;
- q[idx[A[][]]].push((Point){,});d[][]=A[][]-'';
- while(q[].size()+q[].size()+q[].size()) {
- int t=getfront();int x=q[t].front().x,y=q[t].front().y;q[t].pop();
- if(x==n&&y==n) return d[x][y];
- if(vis[x][y]) continue;vis[x][y]=;
- rep(dir,,) {
- int nx=x+mx[dir],ny=y+my[dir];
- if(nx>=&&nx<=n&&ny>=&&ny<=n&&A[nx][ny]!=''&&d[x][y]+A[nx][ny]-''<d[nx][ny]) {
- d[nx][ny]=d[x][y]+A[nx][ny]-'';
- q[idx[A[nx][ny]]].push((Point){nx,ny});
- }
- }
- }
- return -;
- }
- int main() {
- n=read();
- rep(i,,n) scanf("%s",A[i]+);
- memset(idx,-,sizeof(idx));
- rep(i,,n) rep(j,,n) {
- if(idx[A[i][j]]<&&A[i][j]!='') idx[A[i][j]]=tp++;
- d[i][j]=<<;
- }
- printf("%d\n",solve());
- return ;
- }
HDNOIP201404最短路径的更多相关文章
- COJ 0244 HDNOIP201404最短路径
HDNOIP201404最短路径 难度级别: A: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 a.b.c是3个互不相等的1 ...
- Johnson 全源最短路径算法
解决单源最短路径问题(Single Source Shortest Paths Problem)的算法包括: Dijkstra 单源最短路径算法:时间复杂度为 O(E + VlogV),要求权值非负: ...
- Floyd-Warshall 全源最短路径算法
Floyd-Warshall 算法采用动态规划方案来解决在一个有向图 G = (V, E) 上每对顶点间的最短路径问题,即全源最短路径问题(All-Pairs Shortest Paths Probl ...
- Dijkstra 单源最短路径算法
Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...
- Bellman-Ford 单源最短路径算法
Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法.该算法由 Richard Bellman 和 Leste ...
- 最短路径算法-Dijkstra
Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法. 所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径. 以python代码为例,实现Dijkstra算法 1.数据 ...
- bzoj 4016: [FJOI2014]最短路径树问题
bzoj4016 最短路路径问题 Time Limit: 5 Sec Memory Limit: 512 MB Description 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点 ...
- 51nod 1459 迷宫游戏 (最短路径—Dijkstra算法)
题目链接 中文题,迪杰斯特拉最短路径算法模板题. #include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f ],v ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
随机推荐
- HDOJ 2097
#include<stdio.h> int func(int n,int k) { ; a=n; ) { b+=a%k; a=a/k; } return b; } int main() { ...
- Android 中 设置TextView垂直滚动
布局文件 android:scrollbars="vertical" android:singleLine="false" 代码文件 ctl_tv_conten ...
- 【Spring】Spring系列3之Spring AOP
3.Spring AOP 3.1.AOP概述 3.2.前置通知 3.3.后置通知 3.4.返回通知.异常通知.环绕通知 3.5.指定切面优先级 3.6.重用切入点表达式 3.7.引入通知 3.8.基于 ...
- 【Hibernate】Hibernate系列7之二级缓存
二级缓存 7.1.概述 7.2.配置方法
- Largest Divisible Subset
Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of ...
- PHP 调试用函数
2014年7月4日 10:27:59 有些系统函数可以在调试程序时救急用: get_class_methods(); get_class_vars(); get_object_vars(); get_ ...
- eclipse对Java程序的移植
有些Java项目可能不在同一台计算机上开发,所以程序需要平台间进行移植,方法很简单,首先有一个最简单的项目HelloJava 当我们开发完成或者要休息了,一般都会保存然后在项目上右击,选择Close ...
- poj 1611 The Suspects 解题报告
题目链接:http://poj.org/problem?id=1611 题意:给定n个人和m个群,接下来是m行,每行给出该群内的人数以及这些人所对应的编号.需要统计出跟编号0的人有直接或间接关系的人数 ...
- Maven运行时异常java.lang.UnsupportedClassVersionError的解决方案
我用的Maven版本为最新版:3.3.9,但是我执行一个简单的clean命令会报如下错误: Exception in thread "main" java.lang.Unsuppo ...
- [SVN(ubuntu)] svn 文件状态标记含义
A item 文件.目录或是符号链item预定加入到版本库. C item 文件item发生冲突,在从服务器更新时与本地版本发生交迭,在你提交到版本库前,必须手工的解决冲突. D item 文件.目录 ...