题目链接: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. Java I/O模型的简单说明

    1.同步和异步 同步:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行,最简单的例子就是顺序的执行两个方法,当第 ...

  2. 关于MySQL count(distinct) 逻辑的一个bug【转】

    本文来自:http://dinglin.iteye.com/blog/1976026#comments 背景 客户报告了一个count(distinct)语句返回结果错误,实际结果存在值,但是用cou ...

  3. [NSURLSession/Delegate]用Post方式获取网络数据并把数据显示到表格

    #pragma mark 实现NSURLSessionDataDelegate代理 @interface ViewController ()<UITableViewDataSource,UITa ...

  4. nyoj20_吝啬的国度_DFS

    吝啬的国度 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市, ...

  5. JavaScript高级程序设计学习笔记--变量、作用域和内存问题

    传递参数 function setName(obj){ obj.name="Nicholas"; obj=new object(); obj.name="Greg&quo ...

  6. 3ds max输出图片

    通过渲染菜单调出改窗口,然后调整成这种模式,就能渲染出这种效果的图. 可以调背景色: 全局照明:染色,这个控制的是渲染物体的颜色

  7. chaper3_exerise_Uva1568_Molar_Mass_分子量

    #include<iostream> #include<iomanip> #include<string> #include<cctype> using ...

  8. Linux(Ubuntu)之设定开机自启动

    分两种:对自建脚本,对已安装服务 对已安装服务, 只需在/etc/rc.local中添加相应的启动命令,如: 重启后,即可自启动服务. 对自建脚本自启动: 创建脚本test,修改其权限为755,如: ...

  9. Mysql控制语句

    14.6.5.1 CASE Syntax 14.6.5.2 IF Syntax 14.6.5.3 ITERATE Syntax 14.6.5.4 LEAVE Syntax 14.6.5.5 LOOP ...

  10. ios 多线程小结----- GCD篇

    //3 GCD(充分利用设备的多盒)-------------屏蔽了线程,只能看见任务 队列步骤两步,定制任务,将任务添加到队列.GCD将添加的任务,放到线程中去执行,自动执行,自动释放原则:先进先出 ...