我太菜了我竟然不会分层图最短路


迷路(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\)我们将它加一维,表示当前的能量是多少。最后枚举所有可能的终点能量值即可。

上代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cctype>
  5. #include<queue>
  6. #include<vector>
  7. #include<utility>
  8. #define rep(i,a,n) for(int i=a;i<=n;i++)
  9. #define dep(i,n,a) for(int i=n;i>=a;i--)
  10. #define int long long
  11. using namespace std;
  12. queue<pair<int,int> > q;
  13. int n,m,max_energy,dis[55][155],inq[55][55],ans,num,head[55];
  14. struct edge
  15. {
  16. int u,v,time,energy,nxt;
  17. }e[100050];
  18. inline int read()
  19. {
  20. int x=0,f=1;
  21. char ch=getchar();
  22. while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
  23. while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
  24. return x*f;
  25. }
  26. void add(int u,int v,int t,int en)
  27. {
  28. e[++num].u=u;e[num].v=v;
  29. e[num].time=t;e[num].energy=en;
  30. e[num].nxt=head[u];head[u]=num;
  31. }
  32. signed main()
  33. {
  34. memset(head,-1,sizeof head);
  35. memset(dis,127,sizeof dis);
  36. n=read(),m=read(),max_energy=read();
  37. int u,v,t,en;
  38. rep(i,1,m)
  39. {
  40. u=read(),v=read(),t=read(),en=read();
  41. add(u,v,t,en);
  42. }
  43. q.push(make_pair(1,max_energy/2));
  44. ans=dis[0][0];
  45. dis[1][max_energy/2]=0;
  46. inq[1][max_energy/2]=1;
  47. while(!q.empty())
  48. {
  49. int x=q.front().first;
  50. int ee=q.front().second;
  51. inq[x][ee]=0;
  52. q.pop();
  53. for(int st=head[x];~st;st=e[st].nxt)
  54. {
  55. int y=e[st].v;
  56. int ene=e[st].energy;
  57. if(ee+ene>max_energy||ee+ene<0)continue;
  58. if(dis[x][ee]+e[st].time<dis[y][ee+ene])
  59. {
  60. dis[y][ee+ene]=dis[x][ee]+e[st].time;
  61. if(!inq[y][ee+ene])
  62. {
  63. q.push(make_pair(y,ee+ene));
  64. inq[y][ee+ene]=1;
  65. }
  66. }
  67. }
  68. }
  69. rep(i,0,max_energy)
  70. ans=min(ans,dis[n][i]);
  71. printf("%lld",ans);
  72. return 0;
  73. }

2019.10.29 CSP%您赛第四场t2的更多相关文章

  1. 2019.10.28 CSP%您赛第四场t3

    我写不动前两个了. 原谅一下. ____________________________________________________________________________________ ...

  2. 2019.10.26 CSP%您赛第三场

    \(CSP\)凉心模拟^_^ --题源\(lqx.lhc\)等各位蒟蒻 题目名称 比赛 传递消息 开关灯 源文件名 \(competition.cpp\) \(message.cpp\) \(ligh ...

  3. 2019.10.24 CSP%你赛第二场d1t3

    题目描述 Description 精灵心目中亘古永恒的能量核心崩溃的那一刻,Bzeroth 大陆的每个精灵都明白,他们的家园已经到了最后的时刻.就在这危难关头,诸神天降神谕,传下最终兵器——潘少拉魔盒 ...

  4. 【春训团队赛第四场】补题 | 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 ...

  5. NOI.AC NOIP模拟赛 第四场 补记

    NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...

  6. 2019.10.15 CSP初赛知识点整理

    初赛需要的知识点整理如下: (1)计算机的硬件组成与基本常识 (2)单位/进制的转换 (3)进制/逻辑运算相关 (4)概率与期望 (5)排序的各种性质 (6)简单数据结构的使用(栈.队列.链表等) ( ...

  7. 2018.10.29 NOIP2018模拟赛 解题报告

    得分: \(70+60+0=130\)(\(T3\)来不及打了,结果爆\(0\)) \(T1\):简单的求和(点此看题面) 原题: [HDU4473]Exam 这道题其实就是上面那题的弱化版,只不过把 ...

  8. 【2019.10.7 CCF-CSP-2019模拟赛 T3】未知的数组(unknown)(并查集+动态规划)

    预处理 考虑模数\(10\)是合数不好做,所以我们可以用一个常用套路: \(\prod_{i=l}^ra_i\equiv x(mod\ 10)\)的方案数等于\(\prod_{i=l}^ra_i\eq ...

  9. 【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}\ ...

随机推荐

  1. 代码审计之CSRF原理及修复

    在平时的测试中,csrf也是比较容易发现的,主要就是看它对一个操作,有没有检测其时效性(这样表述可能不太准确),一般的防护方法就是添加token来进行校验,并及时对其进行失效处理. 以下所有代码都是我 ...

  2. DeleteFile

    import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import org.apac ...

  3. Android开发——Toolbar常用设置

    本篇笔记用来记录常用的Toolbar设置,如Toolbar颜色设置,显示返回按钮,显示右边三个点按钮 之前Android 使用的ActionBar,Android5.0开始,谷歌官方推荐使用Toolb ...

  4. [一]基本sqlplus命令

    基本sqlplus命令: 1: sqlplus scott/tiger ; #简化连接数据库 2:show user; #想知道当前登陆的用户是哪一位 3:conn 用户名[/密码] [AS SYSD ...

  5. .Net Core自动化部署系列(三):使用GitLab CI/CD 自动部署Api到Docker

    之前写过使用Jenkins实现自动化部署,最近正好没事研究了下GitLab的自动化部署,顺便记录一下. 使用GitLab部署我们需要准备两件事,第一个起码你得有个GitLab,自己搭建或者使用官方的都 ...

  6. centos 7 常用yum源配置

    使用centos系统最熟悉的莫过于yum命令,yum命令可以让安装软件变得那么简单,编译安装的依赖关系大部分都会解决. 工具/原料   centos 7 wget yum 方法/步骤     什么是y ...

  7. Go语言入门教程(十)之函数

    Hello 各位小伙伴大家好,我是小栈君,假期一眨眼就过去了.不知道大家玩的是否开心呢? 上次我们讲到了关于Go语言的流程控制,小栈君也希望小伙伴跟着小栈君一步一个脚印的敲一下代码,相互进步.本期我们 ...

  8. Redis优雅实现分布式锁

    文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 在实际项目开发中经常会遇到这样一个业务场景:如果同一台机器有多个线程抢夺同一个共享资源,同一个线程多次执行会出 ...

  9. 理解LSTM网络--Understanding LSTM Networks(翻译一篇colah's blog)

    colah的一篇讲解LSTM比较好的文章,翻译过来一起学习,原文地址:http://colah.github.io/posts/2015-08-Understanding-LSTMs/ ,Posted ...

  10. Python调用 Openstack 主要服务(keystone,nova,glance,neutron,heat)

    由于Openstack更新很快,现在准备搭建基于Queen版本的Openstack,Queen版本要求keystone版本为V3,所以之前大多数接口都不能用了,百度了一下都没有比较新的实例,官方文档又 ...