题目描述 Description###

\(FYH\) 在 \(ns\) 星系迷路了,情急之下,他找到了你。现在,解救 \(FYH\) 的重任就落在了你的肩上了。

\(ns\) 星系有 \(n\) 颗星球,编号为 \(1\) 到 \(n\) 的整数。星球之间由 \(m\) 条单向的时空隧道相连。经过每个时空隧道要花费一定的时间。\(FYH\) 的飞船最多可以存储 \(max energy\) 的能量,经过有些时空隧道会损失能量,而其他的会增加能量。飞船不能通过损失能量数超过当前能量或者增加能量后飞船能量超过 \(max energy\) 的时空隧道。现在,\(FYH\) 的飞船在编号为 \(1\) 的星球,飞船剩余的能量为 \(max energy\) 的一半。你需要计算出到编号为 \(n\) 的星球的最短时间。

输入描述 Input Description###

第一行三个正整数 \(n\),\(m\) 和 \(max energy\)。

接下来 \(m\) 行,每行 3 个正整数 \(u\) ,\(v\) ,\(time\) 和 1 个整数 \(energy\) 。表示从编号为 \(u\) 的星球到编号为 \(v\) 的星球有一条时空隧道,经过这个隧道花费的时间为 \(time\) 。如果 \(energy\) 为正数,则表示通过会增加 \(energy\) 的能量,否则表示通过会损失 \(−energy\) 的能量。保证,1 ≤ u,v ≤ n,1 ≤ time ≤ 10 4 ,−100 ≤ energy ≤ 100。

每行两个数之间均用空格隔开。

输出描述 Output Description###

输出一行,一个正整数,表示到达的最短时间。数据保证有解。

样例输入 Sample Input###

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

样例输出 Sample Output###

17

数据范围及提示 Data Size & Hint###

\(n \leq 50, m \leq 2000 ,max energy \leq 50\)

之前的一些废话###

题解###

考虑到n很小,\(max energy\) 又不是很大,所以我们就可以设状态\(dp[i][j]\) 表示当前在i星球,有j能量的最短时间,然后把这些状态压成一些点,直接跑一个最短路即可。

代码###

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
#define mem(a,b) memset(a,b,sizeof(a))
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxm=200010,maxn=5010;
struct Edge
{
int u,v,w,power,next;
Edge() {}
Edge(int _1,int _2,int _3,int _4,int _5):u(_1),v(_2),w(_3),power(_4),next(_5) {}
}e[maxm],E[420];
int n,m,Energy,a,b,c,d,c1=-1,c2=-1,First[60],first[maxn],dis[maxn],ans=2147483647;
bool vis[maxn];
priority_queue <PII,vector<PII>,greater<PII> > Q;
int id(int x,int y){return (x-1)*(Energy+1)+y;}
void AddEdge(int a,int b,int c,int d){E[++c2]=Edge(a,b,c,d,First[a]);First[a]=c2;}
void addEdge(int a,int b,int c){e[++c1]=Edge(a,b,c,0,first[a]);first[a]=c1;}
void Dijkstra()
{
mem(dis,42);
dis[id(1,Energy/2)]=0;
Q.push(make_pair(0,id(1,Energy/2)));
while(Q.size())
{
int now=Q.top().second;Q.pop();
if(vis[now])continue;
vis[now]=1;
for(int i=first[now];i!=-1;i=e[i].next)
if(dis[e[i].v]>dis[now]+e[i].w)
{
dis[e[i].v]=dis[now]+e[i].w;
Q.push(make_pair(dis[e[i].v],e[i].v));
}
}
for(int i=0;i<=Energy;i++)ans=min(ans,dis[id(n,i)]);
return;
}
int main()
{
freopen("star.in","r",stdin);
freopen("star.out","w",stdout);
mem(first,-1);mem(First,-1);
n=read();m=read();Energy=read();
for(int i=1;i<=m;i++)a=read(),b=read(),c=read(),d=read(),AddEdge(a,b,c,d);
for(int k=1;k<=n;k++)
for(int j=0;j<=Energy;j++)
for(int i=First[k];i!=-1;i=E[i].next)
if(j+E[i].power<=Energy && j+E[i].power>=0)addEdge(id(k,j),id(E[i].v,j+E[i].power),E[i].w);
Dijkstra();
printf("%d\n",ans);
return 0;
}

总结###

属于套路题。

NOIP模拟赛 迷路的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  9. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

随机推荐

  1. 如何在AbpNext项目中使用Mysql数据库

    配置步骤: 1.更改.Web项目的appsettings.json的数据库连接字符串.如:server=0.0.0.0;database=VincentAbpTest;uid=root;pwd=123 ...

  2. Mysql 免安装教程 百度云网盘有文件和word说明

    一 把文件解压到一个目录下 这是解压后的目录 将my.ini文件考进去 双击打开my.ini 找到这两行更改成自己的解压路径保存 右键此电脑属性 找到高级系统设置配置环境变量 新建—>变量值是解 ...

  3. Python解释器和Python集成环境小结

    目录 一.执行Python程序的两种方式 1.1 交互式 1.2 命令行式 二.执行Python程序的两种IDE 2.1 Pycharm 2.2 Jupyter 一.执行Python程序的两种方式 1 ...

  4. 《细说PHP》第四版 样章 第23章 自定义PHP接口规范 8

    23.5.2  架构详解 本例的实现最重要的就是服务层的设计,有两个配置文件config.php和api.php,其中文件config.php是全局的配置文件,用于整个程序全局需要的参数设置.可以根据 ...

  5. 【linux运维】linux系统上忘记密码如何操作

    目录 红帽系统忘记密码操作 红帽系统设置ip,主机名 centos系统忘记密码操作 一.红帽系统忘记密码操作 1)再出现以下界面后按键盘e键 2)进入以下界面后,再次按e键 3)使用上下键选择第2项或 ...

  6. 【MySQL报错】ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

    ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot exec ...

  7. jQuery 源码分析(十四) 数据操作模块 类样式操作 详解

    jQuery的属性操作模块总共有4个部分,本篇说一下第3个部分:类样式操作部分,用于修改DOM元素的class特性的,对于类样式操作来说,jQuery并没有定义静态方法,而只定义了实例方法,如下: a ...

  8. 黄聪:PHP转换网址相对路径到绝对路径的一种方法

    相信很多程序(尤其是采集类的程序)都会有需要把网址的相对路径转换成绝对路径的需要,例如采集到某页面的HTML代码中包含资源文件经常会看到这样的文件名: <link rel="style ...

  9. [转]Apache Doris资料汇总

    参考资料 https://www.toutiao.com/i6709706901770207748/?tt_from=weixin&utm_campaign=client_share& ...

  10. Delphi - 创建SuperDll 持续更新

    Delphi SuperDll 作为一名5年的Delpher,一直认为Delphi是桌面应用的王者,我相信其他的Delpher也这么认为. 但是,慢慢的我发现普通方式的Delphi开发会造成代码的严重 ...