题目链接: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 + 优先队列)的更多相关文章

  1. hdu 4784 Dinner Coming Soon

    spfa+优先队列.刚开始只用的spfa,结果tle到死.然后听队友说要用到优先队列,想了想,对时间分层的话的确每一个结点都只进队列一次即可,因为只有大时间才能更新出小时间,然后就wa成shi了.按队 ...

  2. ACM学习历程—HDU 2112 HDU Today(map && spfa && 优先队列)

    Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线 ...

  3. HDU 1874 畅通工程续 SPFA || dijkstra||floyd

    http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目大意: 给你一些点,让你求S到T的最短路径. 我只是来练习一下SPFA的 dijkstra+邻接矩阵 ...

  4. hdu 4006 The kth great number(优先队列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4006 题目大意: 第一行 输入 n k,后有 n 行,对于每一行有两种状态 ,①“I x” : 插入 ...

  5. hdu 4006 The kth great number (优先队列)

    /********************************************************** 题目: The kth great number(HDU 4006) 链接: h ...

  6. HDU 2653 (记忆化BFS搜索+优先队列)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2653 题目大意:迷宫中有普通点和陷阱.其中普通点可以走可以飞,但是陷阱只能飞.走耗时1,飞耗时2.但 ...

  7. HDU 1102 Constructing Roads, Prim+优先队列

    题目链接:HDU 1102 Constructing Roads Constructing Roads Problem Description There are N villages, which ...

  8. (hdu) 4857 逃生 (拓扑排序+优先队列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄 ...

  9. 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  ...

随机推荐

  1. Griddle, griddle-react 一个REACT 表格组件

    Griddle, griddle-react 一个REACT 表格组件: http://griddlegriddle.github.io/Griddle/index.html

  2. python之errno

    http://www.cnblogs.com/Security-Darren/p/4168392.html errno.EWOULDBLOCK 操作将会阻塞

  3. tcpdump for android L 5.x with pie support

    由于使用了NDK编译的可执行文件在应用中调用,在4.4及之前的版本上一直没出问题. 最近由于要测试在Android L上的运行情况发现,当运行该可执行文件时,报如下错误: error: only po ...

  4. ffmpeg-20160526-git-bin

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 f ...

  5. 2106 Problem F Shuffling Along 中石油-未提交-->已提交

    题目描述 Most of you have played card games (and if you haven’t, why not???) in which the deck of cards ...

  6. hiho一下第一周 最长回文子串

    题目链接:http://hihocoder.com/contest/hiho1/problem/1 #include <iostream> #include <cstdio> ...

  7. 在SpringMVC中获取request对象

    1.注解法 @Autowired private  HttpServletRequest request; 2. 在web.xml中配置一个监听 <listener> <listen ...

  8. 20145213《Java程序设计》第八周学习笔记

    20145213<Java程序设计>第八周学习笔记 教材学习内容总结 "桃花春欲尽,谷雨夜来收"谷雨节气的到来意味着寒潮天气的基本结束,气温回升加快.刚出冬的我对于这种 ...

  9. 【XLL 文档翻译】【第3部分】必要的和有用的 C API XLM 函数

    本节中将介绍几个对于 DLL 和 XLL 开发人员来说十分重要的回调函数,xlfRegister 函数是可用于注册函数,使得 Excel 可以直接访问 DLL 和 XLl 中的函数. xlfUnreg ...

  10. INNODB

    INNODB,是Mysql5.7的默认存储引擎,是事务安全的,支持ACID,具有提交,回滚和crash-recovery[灾备]能力,以保护用户数据. 优势:一旦Server崩溃,Innodb会自动保 ...