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

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

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

#include<cstdio>
#include<cstring>
#include<algorithm>
typedef unsigned long long ll;
const int N=300010,M=100010,E=1000010,inf=1000000000;
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;
int q[N],h,t,d[N],f[N];bool vis[N],use[M];
char s[18000000],sS[55],sT[55];ll b[N];
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
inline bool check(char x){
if(x>='a'&&x<='z')return 1;
if(x>='A'&&x<='Z')return 1;
if(x>='0'&&x<='9')return 1;
return x=='-'||x=='\''||x=='&';
}
inline ll gethash(int l,int r){
ll t=0;
for(int i=l;i<r;i++)t=t*233+s[i];
return t;
}
inline ll getname(char*s){
scanf("%s",s);
int l=strlen(s);ll t=0;
for(int i=0;i<l;i++)t=t*233+s[i];
return t;
}
inline int ask(ll x){
int l=1,r=n,mid;
while(1){
if(b[mid=(l+r)>>1]==x)return mid;
if(b[mid]<x)l=mid+1;else r=mid-1;
}
}
inline void up(int&x,int y){if(x<y)x=y;}
inline void solve(int x){
if(use[x])return;
use[x]=1;
int i,tmp;
for(i=st[x];i<=en[x];i++)if(!vis[a[i]])vis[q[++t]=a[i]]=1,d[a[i]]=D+1;
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);
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);
}
int main(){
scanf("%d",&Case);
while(Case--){
scanf("%s",s);
gets(s);
l=strlen(s);
for(n=i=0;i<l;)if(!check(s[i]))i++;else{
for(j=i;j<l&&check(s[j]);j++);
b[++n]=gethash(i,j);
i=j;
}
std::sort(b+1,b+n+1);
for(ed=0,i=1;i<=n;i++)g[i]=0;
scanf("%s",s);
gets(s);
l=strlen(s);
for(m=i=0;i<l;)if(!check(s[i]))i++;else{
for(j=i;j<l&&check(s[j]);j++);
m++;
i=j;
}
for(cnt=0,k=1;k<=m;k++){
scanf("%s",s);
scanf("%s",s);
gets(s);
l=strlen(s);
st[k]=cnt+1;
for(i=0;i<l;)if(!check(s[i]))i++;else{
for(j=i;j<l&&check(s[j]);j++);
a[++cnt]=ask(gethash(i,j));
i=j;
}
en[k]=cnt;
for(j=st[k];j<=en[k];j++)add(a[j],k);
use[k]=0;
}
scanf("%s",s);
scanf("%s",s);
scanf("%s",s);
S=ask(getname(sS));
scanf("%s",s);
scanf("%s",s);
scanf("%s",s);
T=ask(getname(sT));
for(i=1;i<=n;i++)d[i]=inf,f[i]=vis[i]=0;
d[S]=f[S]=0;
vis[S]=1;
q[h=t=1]=S;
while(h<=t){
D=d[q[h]];
while(h<=t&&d[q[h]]==D)for(i=g[q[h++]];i;i=nxt[i])solve(v[i]);
}
printf("optimal travel from %s to %s: %d line",sS,sT,d[T]);
if(d[T]>1)putchar('s');
printf(", %d minute",f[T]);
if(f[T]>1)putchar('s');
puts("");
}
return 0;
}

  

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. C# 关于用7zip压缩文件提示win32exception 系统找不到文件解决方案(win7 x64)

    网上已经很多这方面的资料了,我就简单的说下好了 为了方便以后的查看 --------------------- 1.需要下载7zSharp:http://7zsharp.codeplex.com/re ...

  2. rsync同步(winxdows到linux/linux到linxu同步)

    1.什么是rsync? -rsync是类unix系统下的数据镜像备份工具——remote sync.一款快速增量备份工具 Remote Sync,远程同步 支持本地复制,或者与其他SSH.rsync主 ...

  3. eclipse 反编译

    Eclipse Class Decompiler安装此插件,可以编译源代码且调试

  4. pl sql 记住用户名密码

    tools--Preferences--Logon History 选择  “Store history”是默认勾选的,勾上“Store with password” 登录时从下拉框选择用户名则自动登 ...

  5. python下的socket常用方法举例

    python下的socket 1.简单的server和client端的socket代码 server.py: #!/usr/bin/env python #_*_ coding:utf-8 _*_ i ...

  6. html dom之iframe对象

    当从父页面中需要获取使用iframe嵌入的内容时,可以使用图中后面的两个属性 var sonDocument = document.getElementById('iframe_id').conten ...

  7. Expm 9_3 无向图的双连通分量问题

      [问题描述] 给定一个无向图,设计一个算法,判断该图中是否存在关节点,并划分双连通分量. package org.xiu68.exp.exp9; import java.util.Stack; p ...

  8. 前端工程化-webpack简介(一)

    本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependenc ...

  9. LeetCode(60): 第k个排列

    Medium! 题目描述: 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" ...

  10. Elasticsearch创建索引和映射结构详解

    前言 这篇文章详细介绍了如何创建索引和某个类型的映射. 下文中[address]指代elasticsearch服务器访问地址(http://localhost:9200). 1       创建索引 ...