通过BFS可以求出到每个站点的最小花费。

每次从队首取出一个点,枚举所有它能花费1块钱就到达的线路,通过两遍递推求出最大时间。

注意到每个点和每条线路只有第一次使用时有用,所以总时间复杂度为$O(n+m)$。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. typedef unsigned long long ll;
  5. const int N=300010,M=100010,E=1000010,inf=1000000000;
  6. int Case,n,m,i,j,k,l,D,S,T,a[E],cnt,st[M],en[M],g[N],v[E],nxt[E],ed;
  7. int q[N],h,t,d[N],f[N];bool vis[N],use[M];
  8. char s[18000000],sS[55],sT[55];ll b[N];
  9. inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
  10. inline bool check(char x){
  11. if(x>='a'&&x<='z')return 1;
  12. if(x>='A'&&x<='Z')return 1;
  13. if(x>='0'&&x<='9')return 1;
  14. return x=='-'||x=='\''||x=='&';
  15. }
  16. inline ll gethash(int l,int r){
  17. ll t=0;
  18. for(int i=l;i<r;i++)t=t*233+s[i];
  19. return t;
  20. }
  21. inline ll getname(char*s){
  22. scanf("%s",s);
  23. int l=strlen(s);ll t=0;
  24. for(int i=0;i<l;i++)t=t*233+s[i];
  25. return t;
  26. }
  27. inline int ask(ll x){
  28. int l=1,r=n,mid;
  29. while(1){
  30. if(b[mid=(l+r)>>1]==x)return mid;
  31. if(b[mid]<x)l=mid+1;else r=mid-1;
  32. }
  33. }
  34. inline void up(int&x,int y){if(x<y)x=y;}
  35. inline void solve(int x){
  36. if(use[x])return;
  37. use[x]=1;
  38. int i,tmp;
  39. for(i=st[x];i<=en[x];i++)if(!vis[a[i]])vis[q[++t]=a[i]]=1,d[a[i]]=D+1;
  40. for(tmp=-inf,i=st[x];i<=en[x];i++)if(d[a[i]]==D)up(tmp,f[a[i]]-i);else up(f[a[i]],tmp+i);
  41. for(tmp=-inf,i=en[x];i>=st[x];i--)if(d[a[i]]==D)up(tmp,f[a[i]]+i);else up(f[a[i]],tmp-i);
  42. }
  43. int main(){
  44. scanf("%d",&Case);
  45. while(Case--){
  46. scanf("%s",s);
  47. gets(s);
  48. l=strlen(s);
  49. for(n=i=0;i<l;)if(!check(s[i]))i++;else{
  50. for(j=i;j<l&&check(s[j]);j++);
  51. b[++n]=gethash(i,j);
  52. i=j;
  53. }
  54. std::sort(b+1,b+n+1);
  55. for(ed=0,i=1;i<=n;i++)g[i]=0;
  56. scanf("%s",s);
  57. gets(s);
  58. l=strlen(s);
  59. for(m=i=0;i<l;)if(!check(s[i]))i++;else{
  60. for(j=i;j<l&&check(s[j]);j++);
  61. m++;
  62. i=j;
  63. }
  64. for(cnt=0,k=1;k<=m;k++){
  65. scanf("%s",s);
  66. scanf("%s",s);
  67. gets(s);
  68. l=strlen(s);
  69. st[k]=cnt+1;
  70. for(i=0;i<l;)if(!check(s[i]))i++;else{
  71. for(j=i;j<l&&check(s[j]);j++);
  72. a[++cnt]=ask(gethash(i,j));
  73. i=j;
  74. }
  75. en[k]=cnt;
  76. for(j=st[k];j<=en[k];j++)add(a[j],k);
  77. use[k]=0;
  78. }
  79. scanf("%s",s);
  80. scanf("%s",s);
  81. scanf("%s",s);
  82. S=ask(getname(sS));
  83. scanf("%s",s);
  84. scanf("%s",s);
  85. scanf("%s",s);
  86. T=ask(getname(sT));
  87. for(i=1;i<=n;i++)d[i]=inf,f[i]=vis[i]=0;
  88. d[S]=f[S]=0;
  89. vis[S]=1;
  90. q[h=t=1]=S;
  91. while(h<=t){
  92. D=d[q[h]];
  93. while(h<=t&&d[q[h]]==D)for(i=g[q[h++]];i;i=nxt[i])solve(v[i]);
  94. }
  95. printf("optimal travel from %s to %s: %d line",sS,sT,d[T]);
  96. if(d[T]>1)putchar('s');
  97. printf(", %d minute",f[T]);
  98. if(f[T]>1)putchar('s');
  99. puts("");
  100. }
  101. return 0;
  102. }

  

BZOJ4053 : [Cerc2013]Subway的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. 第一次作业——subway

    作业源程序代码:https://github.com/R-81/subway 作业程序使用说明:通过输入命令参数求解路线(仅支持-b,-c),根据参数得出路线后,程序不会结束,此时可输入地铁路线名(例 ...

  3. 2016 Multi-University Training Contest 1 J.Subway

    Subway Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Su ...

  4. Subway Icon Set – 306个像素完美的特制图标

    这个图标集是306个优化的像素完美,精雕细琢的图标.为这些设备进行了优化:iOS.Windows Phone.Windows 8 and BlackBerry 10,提供 PNG, SVG, XALM ...

  5. ural 1272. Non-Yekaterinburg Subway

    1272. Non-Yekaterinburg Subway Time limit: 1.0 secondMemory limit: 64 MB A little town started to co ...

  6. URAL(timus) 1272 Non-Yekaterinburg Subway(最小生成树)

    Non-Yekaterinburg Subway Time limit: 1.0 secondMemory limit: 64 MB A little town started to construc ...

  7. 【POJ】【1635】Subway Tree Systems

    树的最小表示法 给定两个有根树的dfs序,问这两棵树是否同构 题解:http://blog.sina.com.cn/s/blog_a4c6b95201017tlz.html 题目要求判断两棵树是否是同 ...

  8. POJ 2502 Subway (最短路)

    Subway 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/L Description You have just moved ...

  9. POJ 2502 Subway

    Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4928   Accepted: 1602 Descriptio ...

随机推荐

  1. 驱动开发--【字符设备、块设备简介】【sky原创】

    驱动开发   字符设备,块设备,网络设备   字符设备 以字节流的方式访问, 不能随机访问 有例外,显卡.EEPROM可以随机访问   EEPROM可以擦写1亿次,是一种字符设备,可以随机访问 读写是 ...

  2. Linux命令:pigz多线程压缩工具【转】

    学习Linux系统时都会学习这么几个压缩工具:gzip.bzip2.zip.xz,以及相关的解压工具.关于这几个工具的使用和相互之间的压缩比以及压缩时间对比可以看:Linux中归档压缩工具学习 那么P ...

  3. Python3学习笔记25-logging模块

    logging模块,Python自带用来记录日志的模块. 因为工作需要用到关于日志的,最近一直都在看关于日志模块的东西,百度了很多文章,可惜都是看的让人一头雾水,最后运气不错,找到一篇很详细的文章.传 ...

  4. VC++常用数据类型及其操作详解

    原文地址:http://blog.csdn.net/ithomer/article/details/5019367 VC++常用数据类型及其操作详解 一.VC常用数据类型列表 二.常用数据类型转化 2 ...

  5. oracle 回退表空间清理

    1.查看已有表空间,找到回退表空间 SELECT * FROM DBA_TABLESPACES WHERE CONTENTS='UNDO' 2.创建新的回退表空间 create undo tables ...

  6. c# 界面自适应大小

    采用在窗体事件SizeChanged里面代码控制大小和位置,达到自动适应窗体大小,这样做调整起来方便. private void FrmMain_SizeChanged(object sender, ...

  7. 云服务器 linux文件系统异常an error occurren during the file system check导致服务器启动失败

    云服务器 linux文件系统异常an error occurren during the file system check导致服务器启动失败 文件系统宕机,重启后报错,无法启动 处理流程: 1.编辑 ...

  8. vue2的缓存问题(非原创)

    keep-alive是vue内置的一个组件,可以使被它包含的组件处于保留状态,或避免被重新渲染. 用法: 运行结果描述: input输入框内,路由切换输入框内部的内容不会发生改变. 常见的用法:(下图 ...

  9. LeetCode(37): 每k个一组翻转链表

    Hard! 题目描述: 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一 ...

  10. Windows Mysql安装

    一.从https://dev.mysql.com/downloads/windows/installer/5.6.html下载MySQL Installer 二.直接点击默认安装