题目

BOSS送给小唐一辆车。小唐开着这辆车从PKU出发去ZJU上课了。

众所周知,天朝公路的收费站超多的。经过观察地图,小唐发现从PKU出发到ZJU的所有路径只会有N(2<=N<=300)个不同的中转点,其中有M(max(0, N-100) <=M<=N)个点是天朝的收费站。N个中转点标号为1…N,其中1代表PKU,N代表ZJU。中转点之间总共有E(E<=50,000)条双向边连接。

每个点还有一个附加属性,用0/1标记,0代表普通中转点,1代表收费站。当然,天朝的地图上面是不会直接告诉你第i个点是普通中转点还是收费站的。地图上有P(1<=P<=3,000)个提示,用[u, v, t]表示:[u, v]区间的所有中转点中,至少有t个收费站。数据保证由所有标记得到的每个点的属性是唯一的。

车既然是BOSS送的,自然非比寻常了。车子使用了世界上最先进的DaxiaYayamao引擎,简称DY引擎。DY引擎可以让车子从U瞬间转移到V,只要U和V的距离不超过L(1<=L<=1,000,000),并且U和V之间不能有收费站(小唐良民一枚,所以要是经过收费站就会停下来交完钱再走)。

DY引擎果然是好东西,但是可惜引擎最多只能用K(0<=K<=30)次。

分析

这道题的难点主要在求出哪个点有收费站。

可以把题目分成两部分:

求出哪个点有收费站

这部分用到个很神奇的东西,差分约束系统

设\(s_{i}\)表示在中转点1~i有多少个收费站,

那么对于每个提示[u,v,t],

\(s_{v}-s_{u-1}>=c\),移项得\(s_{u-1}-s_{v}<=-c\)。

但这不足以求出所有的\(s\)值,那么注意隐藏条件:

\(s_{i}-s_{i-1}>=0\),移项得\(s_{i-1}-s_{i}<=0\)

\(s_{i}-s_{i-1}<=1\)

接着对于一条式子“a-b<=c”,给b向a连一条权值为c的有向边,搞一遍spfa就可以了(其中\(s_{n}=m\),显然嘛)

求最短路

先把原图分为k+1层,

搞一遍floyd,求出可以瞬移的路径,

每一层连一条可以瞬移的路径到下一层。

spfa完美收场。

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const long long maxlongint=21474836470000;
using namespace std;
long long next[2000000],last[2000000],to[2000000],v[2000000],dis[2000000],d[5000000],f[400][400],re[60000][4];
long long a[400][400];
long long n,m,ans,k,l,e,tot;
bool bz[2000000];
long long bj(long long x,long long y,long long z)
{
next[++tot]=last[x];
last[x]=tot;
to[tot]=y;
v[tot]=z;
}
long long spfa(long long x,long long y)
{
memset(bz,true,sizeof(bz));
memset(dis,60,sizeof(dis));
long long head=0,tail=1,g;
dis[x]=y;
d[1]=x;
while(head<tail)
{
g=d[++head];
bz[g]=true;
for(long long i=last[g];i;i=next[i])
{
long long j=to[i];
if(dis[j]>dis[g]+v[i])
{
dis[j]=dis[g]+v[i];
if(bz[j])
{
bz[j]=false;
d[++tail]=j;
}
}
}
}
}
int main()
{
//第一部分
long long o;
scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&e,&o,&l,&k);
memset(f,60,sizeof(f));
for(long long i=1;i<=e;i++)
{
long long x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
re[i][1]=x;
re[i][2]=y;
re[i][3]=z;
f[x][y]=min(z,f[x][y]);
f[y][x]=f[x][y];
}
for(long long i=1;i<=o;i++)
{
long long x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
bj(y,x-1,-z);
}
for(long long i=2;i<=n;i++)
{
bj(i,i-1,0);
bj(i-1,i,1);
}
spfa(n,m);
//第二部分
memset(last,0,sizeof(last));
tot=0;
for(long long i=1;i<=e;i++)
{
for(long long p=0;p<=k;p++)
{
bj(p*n+re[i][1],p*n+re[i][2],re[i][3]);
bj(p*n+re[i][2],p*n+re[i][1],re[i][3]);
}
}
for(long long i=1;i<=n;i++)
for(long long j=1;j<=n;j++)
{
for(long long p=1;p<=n;p++)
if(i!=j && j!=p && i!=p && dis[p]-dis[p-1]==0 && dis[p]<=m)
{
if(f[i][p]+f[p][j]<f[i][j])
f[i][j]=f[i][p]+f[p][j];
} }
for(long long i=1;i<=n;i++)
for(long long j=1;j<=n;j++)
if(i!=j && f[i][j]<=l)
{
for(long long p=0;p<=k-1;p++)
{
bj(p*n+i,(p+1)*n+j,0);
}
}
spfa(1,0);
ans=maxlongint;
for(long long i=0;i<=k;i++)
ans=min(dis[i*n+n],ans);
printf("%lld\n",ans);
}

【NOIP2013模拟】DY引擎的更多相关文章

  1. 【NOIP2013模拟】终极武器(经典分析+二分区间)

    No.2. [NOIP2013模拟]终极武器 题意: 给定你一些区间,然后让你找出\(1\sim 9\)中的等价类数字. 也就是说在任何一个区间里的任何一个数,把其中后\(k\)位中的某一位换成等价类 ...

  2. JZOJ 3493. 【NOIP2013模拟联考13】三角形

    3493. [NOIP2013模拟联考13]三角形(triangle) (File IO): input:triangle.in output:triangle.out Time Limits: 10 ...

  3. JZOJ 3487. 【NOIP2013模拟联考11】剑与魔法(dragons)

    3487. [NOIP2013模拟联考11]剑与魔法(dragons) (Standard IO) Time Limits: 1000 ms  Memory Limits: 131072 KB  De ...

  4. JZOJ 3470. 【NOIP2013模拟联考8】最短路(path)

    470. [NOIP2013模拟联考8]最短路(path) (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed ...

  5. JZOJ 3388. 【NOIP2013模拟】绿豆蛙的归宿

    3388. [NOIP2013模拟]绿豆蛙的归宿 (Standard IO) Time Limits: 1000 ms  Memory Limits: 131072 KB  Detailed Limi ...

  6. JZOJ 3463. 【NOIP2013模拟联考5】军训

    3463. [NOIP2013模拟联考5]军训(training) (Standard IO) Time Limits: 2000 ms  Memory Limits: 262144 KB  Deta ...

  7. JZOJ 3462. 【NOIP2013模拟联考5】休息(rest)

    3462. [NOIP2013模拟联考5]休息(rest) (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed ...

  8. JZOJ 3461. 【NOIP2013模拟联考5】小麦亩产一千八(kela)

    3461. [NOIP2013模拟联考5]小麦亩产一千八(kela) (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Det ...

  9. JZOJ 3509. 【NOIP2013模拟11.5B组】倒霉的小C

    3509. [NOIP2013模拟11.5B组]倒霉的小C(beats) (File IO): input:beats.in output:beats.out Time Limits: 1000 ms ...

随机推荐

  1. 系统分析与设计HW6

    1. 使用 UML State Model建模 建模对象: 参考 Asg_RH 文档, 对 Reservation/Order 对象建模. 建模要求: 参考练习不能提供足够信息帮助你对订单对象建模,请 ...

  2. ArchLinux下XFCE的一个问题修复:thunar加载的环境变量不正确

    家里的电脑上,安装了Arch32与Arch64.不记得以前做过什么操作, 导致在Arch32下,Thunar启动后,其环境变量缺失很多内容. 主要在PATH及LD_LIBRARY_PATH几个关键变量 ...

  3. Mysql数据库存储数据时间与系统获取时间不一致

    最近进行项目开发,发现存在数据库内的数据和系统查询到的数据相差8小时 发现有2种比较合适的方法 (一)修改mysql服务的区时 centos进入mysql查看/修改时区 1.输入以下命令进入mysql ...

  4. Servlet 响应 响应相关与重定向 请求 获取表单数据2种方法

    一.HttpServletResponse  (响应) 包括下面三个: 1.响应消息行  HTTP/1.1  200 OK 200是HTTP状态码, 代表请求已成功. (查httpservletres ...

  5. JDK,JRE,JVM的区别与联系?

    概念区别 JDK:           Java Develpment Kit java 开发工具JRE:         Java Runtime Environment java运行时环境JVM: ...

  6. python 并发编程 多进程 队列目录

    python 并发编程 多进程 队列 python 并发编程 多进程 生产者消费者模型介绍 python 并发编程 多进程 生产者消费者模型总结 python 并发编程 多进程 JoinableQue ...

  7. [Git] 025 标签命令

    0. 前言 小时候看<剑花-烟雨-江南>,惊讶于那个多重身份的"小侯爷" 后来发现,现实中拥有比小侯爷更多身份的人多如牛毛 其实,在 "Git" 中 ...

  8. 小白用Mac

    老话说的好,“最近老板发我一个Mac,但是不会用,嘎嘎嘎嘎” 1.安装软件 安装 Homebrew Homebrew:使用 Homebrew 安装 Apple 没有预装但 你需要的东西,尤其是非界面管 ...

  9. centos 7 无网络情况下,解决yum 安装依赖rpm包

    方法一:在一台有网络的机器,用yum下载好所需程序,传到另外一台网络的机器上安装 yum install xtrabackup --downloadonly --downloaddir=/rpmpat ...

  10. ccs中a链接的四种状态

    什么是超链接? 超链接通俗地指从一个网页指向一个目标的连接关系,这个目标可以是另一个网页,也可以是相同网页上的不同位置,还可以是一个图片,一个电子邮件地址,一个文件,甚至是一个应用程序.而在一个网页中 ...