2019.10.29 CSP%您赛第四场t2
我太菜了我竟然不会分层图最短路
迷路(star)
【题目描述】
\(cxm\) 在 \(ns\) 星系迷路了,情急之下,他找到了你。现在,解救 \(cxm\) 的重任就落在了
你的肩上了。
\(ns\) 星系有 \(n\) 颗星球,编号为 \(1\) 到 \(n\) 的整数。星球之间由 \(m\) 条单向的时空隧道相
连。经过每个时空隧道要花费一定的时间。\(cxm\) 的飞船最多可以存储 \(max\)\(\_\)\(energy\) 的能
量,经过有些时空隧道会损失能量,而其他的会增加能量。飞船不能通过损失能量数超
过当前能量或者增加能量后飞船能量超过 \(max\_energy\) 的时空隧道。
现在,\(cxm\) 的飞船在编号为 \(1\) 的星球,飞船剩余的能量为 \(max\_energy\) 的一半。你
需要计算出到编号为 \(n\) 的星球的最短时间。
【输入格式】
从文件 \(star.in\) 中读入数据。
第一行三个正整数 \(n,m\) 和 \(max\_energy\)。
接下来 \(m\) 行,每行 \(3\) 个正整数 \(u,v,time\) 和 \(1\) 个整数 \(energy\)。表示从编号为 \(u\) 的星
球到编号为 \(v\) 的星球有一条时空隧道,经过这个隧道花费的时间为 \(time\)。如果 \(energy\)
为正数,则表示通过会增加 \(energy\) 的能量,否则表示通过会损失 \(−energy\) 的能量。保
证,\(1\leq u,v\leq n,1\leq time\leq 10^4 ,−100\leq energy\leq 100\)。
每行两个数之间均用空格隔开。
【输出格式】
输出到文件 \(star.out\) 中。
输出一行,一个正整数,表示到达的最短时间。数据保证有解。
【样例输入】
4 6 4
1 4 100 0
1 2 5 -1
2 3 3 2
3 2 1 -1
3 4 5 -4
3 4 10 -3
【样例输出】
17
【子任务】
每个测试点的数据规模如下
| 测试点 | \(n=\) | \(m=\) | \(max\_energy\) | 数据特点 |
|---|---|---|---|---|
| \(1\) | \(5\) | \(11\) | \(4\) | 无特殊性质 |
| \(2\) | \(8\) | \(16\) | \(4\) | 无特殊性质 |
| \(3\) | \(10\) | \(21\) | \(6\) | 无特殊性质 |
| \(4,5,6\) | \(50\) | \(2000\) | \(10^2\) | 所有的\(energy\)均为正 |
| \(7,8,9,10\) | \(50\) | \(2000\) | \(50\) | 无特殊性质 |
容易想到最短路。但是因为有\(energy\)限制的存在,所以不能跑简单的最短路。
我记得有过一个\(OIdalao\)讲过一句话。
——如果dp不知道一个状态怎么存,就再加一维。
所以对于正常的一维\(SPFA\)我们将它加一维,表示当前的能量是多少。最后枚举所有可能的终点能量值即可。
上代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<queue>
#include<vector>
#include<utility>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define dep(i,n,a) for(int i=n;i>=a;i--)
#define int long long
using namespace std;
queue<pair<int,int> > q;
int n,m,max_energy,dis[55][155],inq[55][55],ans,num,head[55];
struct edge
{
int u,v,time,energy,nxt;
}e[100050];
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
void add(int u,int v,int t,int en)
{
e[++num].u=u;e[num].v=v;
e[num].time=t;e[num].energy=en;
e[num].nxt=head[u];head[u]=num;
}
signed main()
{
memset(head,-1,sizeof head);
memset(dis,127,sizeof dis);
n=read(),m=read(),max_energy=read();
int u,v,t,en;
rep(i,1,m)
{
u=read(),v=read(),t=read(),en=read();
add(u,v,t,en);
}
q.push(make_pair(1,max_energy/2));
ans=dis[0][0];
dis[1][max_energy/2]=0;
inq[1][max_energy/2]=1;
while(!q.empty())
{
int x=q.front().first;
int ee=q.front().second;
inq[x][ee]=0;
q.pop();
for(int st=head[x];~st;st=e[st].nxt)
{
int y=e[st].v;
int ene=e[st].energy;
if(ee+ene>max_energy||ee+ene<0)continue;
if(dis[x][ee]+e[st].time<dis[y][ee+ene])
{
dis[y][ee+ene]=dis[x][ee]+e[st].time;
if(!inq[y][ee+ene])
{
q.push(make_pair(y,ee+ene));
inq[y][ee+ene]=1;
}
}
}
}
rep(i,0,max_energy)
ans=min(ans,dis[n][i]);
printf("%lld",ans);
return 0;
}
2019.10.29 CSP%您赛第四场t2的更多相关文章
- 2019.10.28 CSP%您赛第四场t3
我写不动前两个了. 原谅一下. ____________________________________________________________________________________ ...
- 2019.10.26 CSP%您赛第三场
\(CSP\)凉心模拟^_^ --题源\(lqx.lhc\)等各位蒟蒻 题目名称 比赛 传递消息 开关灯 源文件名 \(competition.cpp\) \(message.cpp\) \(ligh ...
- 2019.10.24 CSP%你赛第二场d1t3
题目描述 Description 精灵心目中亘古永恒的能量核心崩溃的那一刻,Bzeroth 大陆的每个精灵都明白,他们的家园已经到了最后的时刻.就在这危难关头,诸神天降神谕,传下最终兵器——潘少拉魔盒 ...
- 【春训团队赛第四场】补题 | MST上倍增 | LCA | DAG上最长路 | 思维 | 素数筛 | 找规律 | 计几 | 背包 | 并查集
春训团队赛第四场 ID A B C D E F G H I J K L M AC O O O O O O O O O 补题 ? ? O O 传送门 题目链接(CF Gym102021) 题解链接(pd ...
- NOI.AC NOIP模拟赛 第四场 补记
NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...
- 2019.10.15 CSP初赛知识点整理
初赛需要的知识点整理如下: (1)计算机的硬件组成与基本常识 (2)单位/进制的转换 (3)进制/逻辑运算相关 (4)概率与期望 (5)排序的各种性质 (6)简单数据结构的使用(栈.队列.链表等) ( ...
- 2018.10.29 NOIP2018模拟赛 解题报告
得分: \(70+60+0=130\)(\(T3\)来不及打了,结果爆\(0\)) \(T1\):简单的求和(点此看题面) 原题: [HDU4473]Exam 这道题其实就是上面那题的弱化版,只不过把 ...
- 【2019.10.7 CCF-CSP-2019模拟赛 T3】未知的数组(unknown)(并查集+动态规划)
预处理 考虑模数\(10\)是合数不好做,所以我们可以用一个常用套路: \(\prod_{i=l}^ra_i\equiv x(mod\ 10)\)的方案数等于\(\prod_{i=l}^ra_i\eq ...
- 【2019.10.7 CCF-CSP-2019模拟赛 T2】绝对值(abs)(线段树细节题)
找规律 设\(p_i=a_{i+1}-a_i\),则答案就是\(\sum_{i=1}^{n-1}p_i\). 考虑若将\(a_i\)加上\(x\)(边界情况特殊考虑),就相当于是将\(p_{i-1}\ ...
随机推荐
- Mysql学习笔记整理之选用B+tree结构
为什么mysql不使用平衡二叉树? 数据处的深度决定着他的IO操作次数,IO操作耗时大 每一个磁盘块保存的数据量太小 B+Tree和B-Tree的区别? B+树几点关键字搜索采用闭合区间 B+树非叶节 ...
- 字符串转数字(with Java)
1. 字符串中提取数字 两个函数可以帮助我们从字符串中提取数字(整型.浮点型.字符型...). parseInt().parseFloat() valueOf() String str = " ...
- C++:Memory Management
浅谈C++内存管理 new和delete 在C++中,我们习惯用new申请堆中的内存,配套地,使用delete释放内存. class LiF; LiF* lif = new LiF(); // 分配内 ...
- Spring boot 官网学习笔记 - Auto-configuration(@SpringBootApplication、@EnableAutoConfiguration、@Configuration)
Spring Boot auto-configuration attempts to automatically configure your Spring application based on ...
- VirtualBox 启动时提示“获取 VirtualBox COM 对象失败”的解决
昨天给电脑打了一堆补丁和更新,今天启动 VirtualBox 的时候提示 “获取 VirtualBox COM 对象失败”,好在百度到了 CSDN 上的一篇文章解决了这个问题. 错误详情 “获取 Vi ...
- Docker4-docker私库的搭建及常用方法-docker-registry方式
一.简单介绍 前面已经介绍,可以使用Docker Hub公共仓库,但是大多数情况企业都需要创建一个本地仓库供自己使用.这里介绍几种搭建私库的方法 私库的好处有几点 1.节约带宽 2.可以自己定制系统 ...
- Web页面解析过程(浅)
web页面流程 域名解析DNS 域名解析:把域名指向网络空间IP,让人们通过简单的域名访问Web网站的服务. DNS:域名系统 DNS服务器:记录着域名及其对应的IP地址 解析域名: 浏览器中输入 ...
- flask 源码解析:上下文(一)
文章出处 https://www.cnblogs.com/jackchengcc/archive/2018/11/29/10025949.html 一:什么是上下文 每一段程序都有很多外部变量.只有 ...
- 初探内核之《Linux内核设计与实现》笔记下
定时器和时间管理 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务,推迟一段时间执行的任务),因此,时间的管理对于linux来说非常重要. 主要内容: 系统时间 定时器 定时器相关 ...
- 为什么不同命名空间的docker容器可以相互通信?
一.什么是容器网络栈 所谓容器能看见的"网络栈",被隔离在自己的Network Namespace当中 1.网卡(network interface) 2.回环设备(loopbac ...