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}\ ...
随机推荐
- JVM 内存区域大小参数设置
JVM内存包括区域 Heap(堆区) New Generation(新生代) Eden 伊甸园 Survivor From Survivor To Old Generation(老年代) 方法区 Pe ...
- java.sql.SQLException: Data truncation: Incorrect string value: '\xE5\x91\xA8\xE6\x9D\xBE' for column 'cname' at row 1 Query
在将项目上传到服务器时,发生这样的错误,总结了一下. 环境Centos7+tomcat7+Mariadb数据库 首先mysql -uroot -p 输入密码 然后查询数据库当前码表状态 show va ...
- 从壹开始 [Admin] 之五 ║ 实现『按钮』级别权限配置
一.前情回顾 哈喽大家好,在这个欢庆的日子里,老张祝大家工作都能蒸蒸日上!今天正好也是社团成立的第一天,我也是希望今天能是个纪念日,沾沾这个大喜庆! 放假这两天,倒是学到了很多东西,我这个也是承认的, ...
- 猿说python
一.简介 知识改变命运,程序改变世界.互联网时代潜移默化的改变着我们的生活,伴随技术的进步,我想下一个时代应该属于人工智能和机器学习,属于python. pytho ...
- poi下载excel模板
/** * 下载模板 * @param tplName * @param returnName * @param response * @param request * @throws Excepti ...
- 编写shell脚本实现一键创建KVM虚拟机
shell脚本一键创建虚拟机 代码如下: #!/bin/bashname=$1 #把位置变量$1重新定义为name(创建虚拟机的名字)path1=/var/lib/libvirt/images/ #i ...
- 是男人就过八题A_A String Game题解
题意 给一个字符串\(s\),和\(n\)个子串\(t[i]\),两个人博弈,每次取出一个串\(t[i]\),在后面加入一个字符,保证新字符串仍然是\(s\)的子串,无法操作的人输. 分析 n个子串, ...
- 在ZYBO板卡上实现PL-PS交互(通过AXI的方式)
前情提要:参考的是下面所说的原网页,只是原作者用的是vivado 2014.4,我用vivado 2018.2跑的,图是新的,内容大多“换汤不换药”,但是我在做的时候存在一些问题,我记录了下来并将解决 ...
- 从零开始搭建WebAPI Core_SqlSugar管理系统(一) 项目环境需求以及项目搭建
从零开始搭建WebAPI Core_SqlSugar管理系统(一) 项目环境需求以及项目搭建 环境需求 想要使用.NET Core,首先你的Visual Studio(以下简称vs)升级到较高的版本, ...
- ELK 学习笔记之 Logstash之output配置
Logstash之output配置: 输出到file 配置conf: input{ file{ path => "/usr/local/logstash-5.6.1/bin/spark ...