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 + ...
随机推荐
- ****K - Alien's Organ
K - Alien's Organ Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Sub ...
- js输入框对金额的匹配
/** * 金额格式化 * @param s * @param n * @returns {String} */ function fmoney(s, n) { n = n > 0 && ...
- leaflet地图在选项卡中不正常显示
可以在选项卡中加个click事件,调用下 <a href="#tab1" >tab1</a><a href="#tab2" onc ...
- wcf测试工具
WCF测试工具-WcfStorm WCF测试工具-WcfStorm http://www.wcfstorm.com/wcf/home.aspx WcfStorm is a dead-simple, ...
- inception cenOS 安装
inception手册http://mysql-inception.github.io/inception-document/install/ 执行命令sh inception_build.sh,ce ...
- Python--变量作用域
变量作用域: 一般在函数体外定义的变量成为全局变量,在函数内部定义的变量称为局部变量. 全局变量所有作用域都可读,局部变量只能在本函数可读 函数在读取变量时,优先读取函数本身自有的局部变量,再去读全局 ...
- yii2.0面包屑的使用及启用中文
(注:己yii2.0高级应用为例) 面包屑在布局里定义好之后,在视图中直接使即可,但默是使用英文. 一.布局中定义面包屑 backend/views/layout/main.php: use back ...
- redis34--string 操作
String类型操作 1.set key value 设置key对应的值为string类型的value 2.mset key1 value1 - keyN valueN 一次设置多个key的值 3. ...
- android 进程和线程管理
进程和线程的概念: 进程:程序的运行实例. 线程:cpu调度基本单位. Activity启动的时候,启动一个主线程,两个binder线程. 主线程实如何产生的?ZygoteInit启动,经由一系列调用 ...
- Spring的字符编码过滤器CharacterEncodingFilter
Spring中的字符编码过滤器,用来解决我们项目中遇到的编码问题. 使用方式特别友好,在web.xml加入: <filter> <description>字符集过滤器</ ...