hdu 4784 Dinner Coming Soon(spfa + 优先队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4784
思路:建图,对于同一个universe来说,就按题目给的条件相连,对于相邻的universe,连时间花费为1,费用为0的边,需要注意的是,对于起始点和终点只需在universe
0连边就可以了,对于相邻的universe则不需要建边。然后就是跑spfa了,其中dp[u][b][t]表示在顶点u,手中有b袋盐,花费时间为t的最大收益。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std; const int MAX_N = (233);
const int inf = 0x3f3f3f3f;
int N, M, B, K, R, T; struct Node {
int v, time, cost;
Node () {}
Node (int _v, int _time, int _cost) : v(_v), time(_time), cost(_cost) {}
}; vector<Node > g[MAX_N * 5];
int Kuniverse[7][MAX_N]; void Build_Map()
{
for (int i = 0; i <= N * K + 1; ++i) g[i].clear(); for (int i = 1; i <= M; ++i) {
int a, b, t, m;
scanf("%d %d %d %d", &a, &b, &t, &m);
g[a - 1].push_back(Node(b - 1, t, m)); if (a != 1 && b != N) {
for (int j = 1; j < K; ++j) {
g[N * j + (a - 1)].push_back(Node( N * j + (b - 1), t, m));
}
}
} for (int i = 0; i < K; ++i) {
for (int j = 1; j < N - 1; ++j) {
g[i * N + j].push_back(Node(((i + 1) % K) * N + j, 1, 0)); }
}
} int dp[MAX_N * 5][7][MAX_N]; // 当前所在的位置,salt的数目,以及所花费的时间
bool vis[MAX_N * 5][7][MAX_N];
struct State {
int v, bag, t;
State() {}
State(int _v, int _bag, int _t) : v(_v), bag(_bag), t(_t) {}
bool operator < (const State& s) const {
return s.t < t;
}
};
int spfa(int st, int ed)
{
for (int i = 0; i <= N * K + 1; ++i) {
for (int j = 0; j <= B + 1; ++j) {
for (int k = 0; k <= T + 1; ++k) dp[i][j][k] = -1, vis[i][j][k] = false;
}
}
dp[0][0][0] = R;
priority_queue<State > que; //貌似不用优先队列要T...
que.push(State(0, 0, 0)); while (!que.empty()) {
State p = que.top();
que.pop(); vis[p.v][p.bag][p.t] = false; if (p.v == ed) continue; //这个条件没加wa,题目上说只要到达ed就立刻结束旅途 for (int i = 0; i < (int)g[p.v].size(); ++i) {
Node node = g[p.v][i];
if (node.time + p.t <= T && dp[p.v][p.bag][p.t] - node.cost >= 0 && dp[p.v][p.bag][p.t] - node.cost > dp[node.v][p.bag][node.time + p.t]) {
dp[node.v][p.bag][node.time + p.t] = dp[p.v][p.bag][p.t] - node.cost;
if (!vis[node.v][p.bag][node.time + p.t]) {
vis[node.v][p.bag][node.time + p.t] = true;
que.push(State(node.v, p.bag, node.time + p.t));
}
} if (Kuniverse[node.v / N][node.v % N] > 0 && p.bag > 0 && node.time + p.t <= T && dp[p.v][p.bag][p.t] - node.cost + Kuniverse[node.v / N][node.v % N] > dp[node.v][p.bag - 1][node.time + p.t]) {
dp[node.v][p.bag - 1][node.time + p.t] = dp[p.v][p.bag][p.t] - node.cost + Kuniverse[node.v / N][node.v % N];
if (!vis[node.v][p.bag - 1][node.time + p.t]) {
vis[node.v][p.bag - 1][node.time + p.t] = true;
que.push(State(node.v, p.bag - 1, node.time + p.t));
}
} if (Kuniverse[node.v / N][node.v % N] > 0 && p.bag + 1 <= B && node.time + p.t <= T && dp[p.v][p.bag][p.t] - node.cost - Kuniverse[node.v / N ][node.v % N] >= 0 && dp[p.v][p.bag][p.t] - node.cost - Kuniverse[node.v / N][node.v % N] > dp[node.v][p.bag + 1][node.time + p.t]) {
dp[node.v][p.bag + 1][node.time + p.t] = dp[p.v][p.bag][p.t] - node.cost - Kuniverse[node.v / N][node.v % N];
if (!vis[node.v][p.bag + 1][node.time + p.t]) {
vis[node.v][p.bag + 1][node.time + p.t] = true;
que.push(State(node.v, p.bag + 1, node.time + p.t));
}
}
}
} int ans = -1;
for (int i = 0; i <= B; ++i) {
for (int j = 0; j <= T; ++j) {
if (dp[ed][i][j] > ans) ans = dp[ed][i][j];
}
} return ans;
} int main()
{
int Cas, t = 1;
scanf("%d", &Cas);
while (Cas--) {
scanf("%d %d %d %d %d %d", &N, &M, &B, &K, &R, &T);
for (int i = 0; i < K; ++i) {
for (int j = 0; j < N; ++j) scanf("%d", &Kuniverse[i][j]);
} Build_Map(); int ans = spfa(0, N - 1); printf("Case #%d: ", t++);
if (ans == -1) {
puts("Forever Alone");
} else
printf("%d\n", ans);
}
return 0;
}
hdu 4784 Dinner Coming Soon(spfa + 优先队列)的更多相关文章
- hdu 4784 Dinner Coming Soon
spfa+优先队列.刚开始只用的spfa,结果tle到死.然后听队友说要用到优先队列,想了想,对时间分层的话的确每一个结点都只进队列一次即可,因为只有大时间才能更新出小时间,然后就wa成shi了.按队 ...
- ACM学习历程—HDU 2112 HDU Today(map && spfa && 优先队列)
Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线 ...
- HDU 1874 畅通工程续 SPFA || dijkstra||floyd
http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目大意: 给你一些点,让你求S到T的最短路径. 我只是来练习一下SPFA的 dijkstra+邻接矩阵 ...
- hdu 4006 The kth great number(优先队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4006 题目大意: 第一行 输入 n k,后有 n 行,对于每一行有两种状态 ,①“I x” : 插入 ...
- hdu 4006 The kth great number (优先队列)
/********************************************************** 题目: The kth great number(HDU 4006) 链接: h ...
- HDU 2653 (记忆化BFS搜索+优先队列)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2653 题目大意:迷宫中有普通点和陷阱.其中普通点可以走可以飞,但是陷阱只能飞.走耗时1,飞耗时2.但 ...
- HDU 1102 Constructing Roads, Prim+优先队列
题目链接:HDU 1102 Constructing Roads Constructing Roads Problem Description There are N villages, which ...
- (hdu) 4857 逃生 (拓扑排序+优先队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄 ...
- POJ 1364 / HDU 3666 【差分约束-SPFA】
POJ 1364 题解:最短路式子:d[v]<=d[u]+w 式子1:sum[a+b+1]−sum[a]>c — sum[a]<=sum[a+b+1]−c−1 ...
随机推荐
- Python模块之optparse
参考: http://www.cnblogs.com/captain_jack/archive/2011/01/11/1933366.html https://docs.python.org/2/li ...
- Tomcat内存溢出(java.lang.OutOfMemoryError: PermGen space)
Tomcat启动时报如下错误: java.lang.OutOfMemoryError: PermGen space 解决办法: 配置相关内存大小.其中按照启动tomcat的不同方式,分 ...
- Effective C++ -----条款52:写了placement new 也要写 placement delete
当你写一个placement operator new ,请确定也写出了对应的placement operator delete.如果没有这样做,你的程序可能会发生隐微而时断时续的内存泄漏. 当你声明 ...
- BestCoder25 1001.Harry and Magical Computer(hdu 5154) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5154 题目意思:有 n 门 processes(编号依次为1,2,...,n),然后给出 m 种关系: ...
- 【编程题目】在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b。
第 17 题(字符串):题目:在一个字符串中找到第一个只出现一次的字符.如输入 abaccdeff,则输出 b. 思路:此题非常容易. 最开始是想开辟一块空间存储每个字符出现的次数. 但转念一想,似乎 ...
- 【xml】转义字符 <等符号出现的原因
来源:http://www.cnblogs.com/hyd309/p/3549076.html HTML中的转义字符 HTML中<, >,&等有特别含义,(前两个字符用于链接签, ...
- linux service命令常见使用方法
service命令,顾名思义,就是用于管理Linux操作系统中服务的命令. 1. 声明:这个命令不是在所有的linux发行版本中都有.主要是在redhat.fedora.mandriva和centos ...
- Callable 和 Future接口 学习
* Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务. * Callable和Runnable有几点不同: * (1)C ...
- java获取短uuid
public static String[] chars = new String[] { "a", "b", "c", "d&q ...
- Vector_h
#ifndef VECTOR_H #define VECTOR_H #include <algorithm> template<typename Object> class V ...