HDU 2722 Here We Go(relians) Again (spfa)
Here We Go(relians) Again
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 1 Accepted Submission(s) : 1
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Fortunately for the Gorelian Minister of Traffic (that would be you), all Gorelian cities are laid out as a rectangular grid of blocks, where each block is a square measuring 2520 rels per side (a rel is the Gorelian Official Unit of Distance). The speed limit between two adjacent intersections is always constant, and may range from 1 to 9 rels per blip (a blip, of course, being the Gorelian Official Unit of Time). Since Gorelians have outlawed decimal numbers as unholy (hey, if you're the dominant force in the known universe, you can outlaw whatever you want), speed limits are always integer values. This explains why Gorelian blocks are precisely 2520 rels in length: 2520 is the least common multiple of the integers 1 through 9. Thus, the time required to travel between two adjacent intersections is always an integer number of blips.
In all Gorelian cities, Government Housing is always at the northwest corner of the city, while the Government Building is always at the southeast corner. Streets between intersections might be one-way or two-way, or possibly even closed for repair (all this tinkering with traffic patterns causes a lot of accidents). Your job, given the details of speed limits, street directions, and street closures for a Gorelian city, is to determine the fastest route from Government Housing to the Government Building. (It is possible, due to street directions and closures, that no route exists, in which case a Gorelian Official Temporary Holiday is declared, and the Gorelian Officials take the day off.)
The picture above shows a Gorelian City marked with speed limits, one way streets, and one closed street. It is assumed that streets are always traveled at the exact posted speed limit, and that turning a corner takes zero time. Under these conditions, you should be able to determine that the fastest route from Government Housing to the Government Building in this city is 1715 blips. And if the next day, the only change is that the closed road is opened to two way traffic at 9 rels per blip, the fastest route becomes 1295 blips. On the other hand, suppose the three one-way streets are switched from southbound to northbound (with the closed road remaining closed). In that case, no route would be possible and the day would be declared a holiday.
Input
Output
Sample Input
2 2
9 * 9 *
6 v 0 * 8 v
3 * 7 *
3 * 6 v 3 *
4 * 8 *
2 2
9 * 9 *
6 v 9 * 8 v
3 * 7 *
3 * 6 v 3 *
4 * 8 *
2 2
9 * 9 *
6 ^ 0 * 8 ^
3 * 7 *
3 * 6 ^ 3 *
4 * 8 *
0 0
Sample Output
1715 blips
1295 blips
Holiday
/*
这题题目很长,关键在于输入,一条一条输入
‘*’:表示双向
‘>’:表示只能从左向右
‘<’:表示只能从右向左
‘^’:表示只能从下往上
‘v’:表示只能从上往下
如果一条路上的规定速度为0,表示不通
如果不能从左上到右下则输出“Holiday”
否则输出最短的时间
*/ #include <iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int inf=0x7fffffff;
struct node
{
int num,v;
node(int a,int b){num=a; v=b;}
};
vector<node> s[*];
int n,m;
bool vis[*];
int dis[*];
void spfa()
{
for(int i=;i<=(n+)*(m+);i++)dis[i]=inf,vis[i]=;
queue<int> Q;
dis[]=;
vis[]=;
Q.push();
while(!Q.empty())
{
int u=Q.front();
Q.pop();
vis[u]=;
for(int i=;i<s[u].size();i++)
{
if(dis[s[u][i].num]<=dis[u]+/s[u][i].v) continue;
dis[s[u][i].num]=dis[u]+/s[u][i].v;
if(!vis[s[u][i].num])
{
vis[s[u][i].num]=;
Q.push(s[u][i].num);
}
}
}
}
void read()
{
int x;
char ch[];
for(int i=;i<=(n+)*(m+);i++) s[i].clear();
for(int i=;i<=m;i++) //先处理第一行
{
scanf("%d",&x);
scanf("%s",&ch);
if(x==) continue;
if (ch[]=='*')
{
s[i].push_back(node(i+,x));
s[i+].push_back(node(i,x));
}
if (ch[]=='>')s[i].push_back(node(i+,x));
if (ch[]=='<')s[i+].push_back(node(i,x));
} for(int i=;i<=n;i++)
{
for(int j=;j<=(m+);j++)
{
scanf("%d",&x);
scanf("%s",&ch);
if (x==) continue;
int p=(i-)*(m+)+j;
int q=i*(m+)+j;
if (ch[]=='*')
{
s[p].push_back(node(q,x));
s[q].push_back(node(p,x));
}
if (ch[]=='^') s[q].push_back(node(p,x));
if (ch[]=='v') s[p].push_back(node(q,x));
} for(int j=;j<=m;j++)
{
scanf("%d",&x);
scanf("%s",&ch);
if (x==) continue;
int p=i*(m+)+j;
int q=i*(m+)+j+;
if (ch[]=='*')
{
s[p].push_back(node(q,x));
s[q].push_back(node(p,x));
}
if (ch[]=='<') s[q].push_back(node(p,x));
if (ch[]=='>') s[p].push_back(node(q,x));
} }
return;
}
int main()
{
while(scanf("%d%d",&n,&m))
{
if (n== && m==) break;
read();
spfa();
if (dis[(n+)*(m+)]==inf) printf("Holiday\n");
else printf("%d blips\n",dis[(n+)*(m+)]);
}
return ;
}
HDU 2722 Here We Go(relians) Again (spfa)的更多相关文章
- POJ 3653 & ZOJ 2935 & HDU 2722 Here We Go(relians) Again(最短路dijstra)
题目链接: PKU:http://poj.org/problem? id=3653 ZJU:problemId=1934" target="_blank">http ...
- 模板C++ 03图论算法 1最短路之单源最短路(SPFA)
3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过 ...
- HDU 1052 Tian Ji -- The Horse Racing(贪心)(2004 Asia Regional Shanghai)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1052 Problem Description Here is a famous story in Ch ...
- HDU 1087:Super Jumping! Jumping! Jumping!(LIS)
Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- HDU 1358 Period (kmp求循环节)(经典)
<题目链接> 题目大意: 意思是,从第1个字母到第2字母组成的字符串可由某一周期性的字串(“a”) 的两次组成,也就是aa有两个a组成: 第三行自然就是aabaab可有两个aab组成: 第 ...
- HDU 2491 Priest John's Busiest Day(贪心)(2008 Asia Regional Beijing)
Description John is the only priest in his town. October 26th is the John's busiest day in a year be ...
- HDU - 6400 多校8 Parentheses Matrix(构造)
Parentheses Matrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Oth ...
- hdu多校第三场 1006 (hdu6608) Fansblog Miller-Rabin素性检测
题意: 给你一个1e9-1e14的质数P,让你找出这个质数的前一个质数Q,然后计算Q!mod P 题解: 1e14的数据范围pass掉一切素数筛法,考虑Miller-Rabin算法. 米勒拉宾算法是一 ...
- hdu 1028 Ignatius and the Princess III(母函数)
题意: N=a[1]+a[2]+a[3]+...+a[m]; a[i]>0,1<=m<=N; 例如: 4 = 4; 4 = 3 + 1; 4 = 2 + 2; 4 = 2 + ...
随机推荐
- rte_mempool内存管理
DPDK以两种方式对外提供内存管理方法,一个是rte_mempool,主要用于网卡数据包的收发:一个是rte_malloc,主要为应用程序提供内存使用接口.本文讨论rte_mempool.rte_me ...
- double hashing 双重哈希
二度哈希(rehashing / double hashing) 1.二度哈希的工作原理如下: 有一个包含多个哈希函数(H1……Hn)的集合.当我们要从哈希表中添加或获取元素时,首先使用哈希函数H1. ...
- Openlayer 3 最简单的弹出框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 兼容 console 没删除引起 低级浏览器 报错问题
/*重写connsole.log,防止调试代码出错*/if (!window.console){ var names = ["log", "debug", &q ...
- geekNews 学习总结
1:下移隐藏,上移出现 //android.support.v4.widget.NestedScrollView nsvScroller; //FrameLayout llDetailBottom; ...
- react视频入门
http://pan.baidu.com/s/1i46by8t 密码:48tt
- Javaweb 第7天 Servlet课程
Servlet课程 三日大纲 ● 网络概念,专业术语 ● Tomcat使用,发布网站,使用Myeclispe发布网站(搭建环境) ● 编写Servlet,Servlet生命周期 ● 用户注册,显示所有 ...
- L2-010. 排座位
L2-010. 排座位 题目链接:https://www.patest.cn/contests/gplt/L2-010 并查集 相关题目:L2-007. 家庭房产,L3-003. 社交集群 下午打的时 ...
- js 对象 视频 插入元素
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- oracle常用的数据字典
一.oracle数据字典主要由以下几种视图构成:1.user视图以user_为前缀,用来记录用户对象的信息 2.all视图以all_为前缀,用来记录用户对象的信息及被授权访问的对象信息 3.dba视图 ...