通过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. wget安装pip和pip3

    pip的安装 1.1 pip下载 wget "https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5=834b2 ...

  2. Mashup

    简介 mashup是糅合,是当今网络上新出现的一种网络现象,将两种以上使用公共或者私有数据库的web应用,加在一起,形成一个整合应用.一般使用源应用的API接口,或者是一些rss输出(含atom)作为 ...

  3. zabbix系列(七)zabbix3.0添加对tcp连接数及状态的监控

    原理: netstat -an|awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}' TIME_WAIT 79 ESTABLISHED 6 LISTE ...

  4. js 数组、对象转json 以及json转 数组、对象

    1.JS对象转JSON 方式:JSON.stringify(obj) var json = {"name":"iphone","price" ...

  5. Linux查看文件命令

    linux查看日志文件内容命令有 cat 由第一行开始显示文件内容 tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写 nl 显示的时候,顺道输出行号! more 一页一页的显示文件内 ...

  6. vue系列之flex经典案例

    案例分析: 1.中间文字居中 2.文字俩边有横线 横线无法固定宽度,因为在大屏手机上,容易出现Bug,宽度不够,俩边会出现大量空隙 解决办法,使用flex布局(网站链接) 代码: <div cl ...

  7. Java基础94 分页查询(以MySQL数据库为例)

    1.概述 分页查询,也可叫做分批查询,基于数据库的分页语句(不同数据库是不同的).  本文使用的事MySql数据库.       假设:每页显示10条数据.       Select * from c ...

  8. Neural style transfer

    网络风格迁移 作者:无用 本文通过学习吴恩达视频所做笔记 目录 简介 可视化卷积层 构建风格迁移网络 一.网络风格迁移简介 二.可视化卷积层 可视化深层卷积网络???这个问题我看过一篇文章,我会在后补 ...

  9. Jquery----对文档操作

    jquery对css操作: 1.CSS .css() - .css("color") -> 获取color css值 - .css("color", &q ...

  10. 微信h5支付源码DEMO参考

    类库代码 wechatH5Pay.php <?php //use Flight; /** * 微信支付服务器端下单 * 微信APP支付文档地址: https://pay.weixin.qq.co ...