【分层最短路】Joyride
http://codeforces.com/gym/101873
C
多开一维状态记录时间,d[i][t] = 经过时间t走到节点i的最小花费
每一个状态分别向“原地等待”与“前往下一个节点”转移
代码:
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <vector>
using namespace std;
typedef long long ll;
const int MAX_V = 1005;
const int MAX_E = 2005;
ll p[MAX_V], t[MAX_V];
int N, M, T, pick;
struct Dijkstra {
struct Edge {
int to, next;
ll cost;
} es[MAX_E];
struct Node {
int u;
ll d, k;
Node(int u, ll d, ll k) : u(u), d(d), k(k) {}
bool operator< (const Node& n) const {
return d > n.d;
}
};
int head[MAX_V];
int V, E;
ll d[MAX_V][1005];
bool vis[MAX_V][1005];
void init(int V) {
this->V = V;
this->E = 0;
memset(head, -1, sizeof head);
}
void addEdge(int u, int v, ll w) {
es[E].to = v;
es[E].cost = w;
es[E].next = head[u];
head[u] = E++;
}
void dijkstra(int s) {
priority_queue <Node> Q;
memset(d, 0x3f, sizeof d);
memset(vis, 0, sizeof(vis));
d[s][t[1]] = p[1];
Q.push(Node(s, p[1], t[1]));
while (!Q.empty()) {
int u = Q.top().u;
ll k = Q.top().k;
Q.pop();
if (vis[u][k])
continue;
vis[u][k] = true;
if (k + t[u] <= pick && d[u][k + t[u]] > d[u][k] + p[u]) {
d[u][k + t[u]] = d[u][k] + p[u];
Q.push(Node(u, d[u][k + t[u]], k + t[u]));
}
for (int i = head[u]; i != -1; i = es[i].next) {
int v = es[i].to;
ll w = es[i].cost;
if (k + w + t[v] <= pick && d[v][k + w + t[v]] > d[u][k] + p[v]) {
d[v][k + w + t[v]] = d[u][k] + p[v];
Q.push(Node(v, d[v][k + w + t[v]], k + w + t[v]));
}
}
}
}
} dijk;
int main() {
scanf("%d%d%d%d", &pick, &N, &M, &T);
dijk.init(N);
while (M--) {
int a, b;
scanf("%d%d", &a, &b);
dijk.addEdge(a, b, T);
dijk.addEdge(b, a, T);
}
for (int i = 1; i <= N; i++) {
scanf("%lld%lld", &t[i], &p[i]);
}
dijk.dijkstra(1);
if (dijk.vis[1][pick])
printf("%lld\n", dijk.d[1][pick]);
else
puts("It is a trap.");
}
【分层最短路】Joyride的更多相关文章
- ROADS POJ - 1724(分层最短路)
就是在最短路的基础上 多加了一个时间的限制 , 多一个限制多一维就好了 记住 分层最短路要用dijistra !!! #include <iostream> #include < ...
- 拯救大兵瑞恩 HDU - 4845(状压bfs || 分层最短路)
1.状压bfs 这个状压体现在key上 我i们用把key状压一下 就能记录到一个点时 已经拥有的key的种类 ban[x1][y1][x2][y1]记录两个点之间的状态 是门 还是墙 还是啥都没有 ...
- ACM-ICPC 2018 南京赛区网络预赛 L && BZOJ 2763 分层最短路
https://nanti.jisuanke.com/t/31001 题意 可以把k条边的权值变为0,求s到t的最短路 解析 分层最短路 我们建立k+1层图 层与层之间边权为0,i 向 i+1层转 ...
- 分层最短路(牛客第四场)-- free
题意: 给你边权,起点和终点,有k次机会把某条路变为0,问你最短路是多长. 思路: 分层最短路模板题.题目有点坑(卡掉了SPFA,只能用dijkstra跑的算法). #include<iostr ...
- 牛客练习赛47 D DongDong坐飞机 (分层最短路)
链接:https://ac.nowcoder.com/acm/contest/904/D 来源:牛客网 DongDong坐飞机 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...
- HDU5669 Road 分层最短路+线段树建图
分析:(官方题解) 首先考虑暴力,显然可以直接每次O(n^2) 的连边,最后跑一次分层图最短路就行了. 然后我们考虑优化一下这个连边的过程 ,因为都是区间上的操作,所以能够很明显的想到利用线段树来维 ...
- 2018-南京网络赛icpc-L题(分层最短路)
题意:给你n个点,m条边的有向带权图,然后你每次可以选<=k条边的边权变成0,问你1到n的最短路: 解题思路:这道题基本上就是原题了呀,bzoj2763(无向图),解法就是拆点跑分层的最短路,比 ...
- 【洛谷 P4568】 [JLOI2011]飞行路线 (分层最短路)
题目链接 分层图最短路. 把每个点拆成\(k+1\)个点,表示总共有\(k+1\)层. 然后每层正常连边, 若\((u,v)\)有边,则把每一层的\(u\)和下一层的\(v\).每一层的\(v\)和下 ...
- 洛谷P4009 汽车加油行驶问题(分层最短路)
传送门 说好的网络流24题呢……上次是状压dp,这次怎么又最短路了…… 不过倒是用这题好好学了一下分层图最短路 把每一个位置$(x,y)$,油量剩余$k$表示为一个状态,然后转化成一个$n$进制数,这 ...
随机推荐
- Linux常用命令拾遗
查看端口对应的程序: netstat -nlap | grep 5004 输出: tcp 0 0 192.168.3.000:5004 192.118.201.00:50800 ESTABLISHED ...
- Linux用户和权限管理
用户:资源获取标识符,资源分配,安全权限模型的核心要素之一 密码:来实现用户认证 创建用户:useradd Username 生成的属性信息 /etc/passwd 用户名:密码:占位符:UID:GU ...
- e.currentTarget与e.target
e.currentTarget指的是注册了事件监听器的对象,而e.target指的是该对象里的子对象 html中 <div id="addBtn" v-on:click= ...
- iOS 越狱后 SSH 不能连接
10.3 越狱之后,装上 OpenSSH, 但是发现连接不上,一直卡着不动,端口是通的,但是就是一直卡着.解决方法是在 Cydia 添加源 http://apt.cydiaba.cn,搜索 Dropb ...
- Android开发 使用HBuilder的缓存方法
/* * 中间就可以进行封装操作 * mui就代表mui,owner就代表window的app属性,就是一个传值 */ (function(mui,owner) { /** * 获取当前状态 **/ ...
- 基于 pyMongo 和 wxPython 实现的 MongoDB Schema Analyser
MongoDB 作为文档型 NoSql 数据库,它的集合表结构往往不像关系型数据库那么固定和统一,同一个集合下的文档(document)的字段变化和差异可能很大,特别是在数据模型缺乏良好规划和规范的数 ...
- Linux 判断系统任务是否正在运行
#!/bin/bash if ps -ef|grep "php index"|egrep -v grep >/dev/null then >& >> ...
- linux环境mysql的安装主从关系的配置
- PTA(BasicLevel)-1009 说反话
一 .问题描述 原题描述 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出.不同于字符串逆序,这里需要的是将字符串中的单词顺序翻转. 输入样例: Hello World Here ...
- 20155203 2016-2017-2 《Java程序设计》第2周学习总结
20155203 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 第三章的主要内容是使用Java语言设计程序的基础语法的学习 java语言中的计算:如果两个数 ...