题目链接: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. Android 程序中得到root activity的引用

    今天写anroid时,想获得一个root activity的引用. ios中这个很简单, [UIApplication sharedApplication].keyWindow 得到window对象, ...

  2. 在Debian上用Bind 配置DNS服务器

    1 什么是DNS 初学者可能不理解DNS到底是什么,干什么用.我是在1998年大学毕业时才听说这个词的.那时我在聊天室碰到潍坊信息港的一个网管,我恬不知耻地说我也是个网管,他说也维护DNS吗?我说,D ...

  3. Effective C++ -----条款17:以独立语句将newed对象置入智能指针

    以独立语句将newed对象存储于(置入)智能指针内.如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄露.

  4. HDU 4940 Destroy Transportation system(无源汇有上下界最大流)

    看不懂题解以及别人说的集合最多只有一个点..... 然后试了下题解的方法http://blog.sina.com.cn/s/blog_6bddecdc0102uzka.html 首先是无源汇有上下界最 ...

  5. spfa(模板)

    spfa作为图论中的常用算法,深受各类出题人和各位OIer的喜爱: so,为了给大众创造福利,宝宝在此奉上spfa大发的思路和模板:以感谢社会, 感谢CCF,感谢CCTV, 感谢我的老师,感谢同学们, ...

  6. xmpp SASL 定义

    SASL 定义 <摘抄自:xmpp_3920> [SASL]的 profiling 需求要求协议定义 供以下信息: 服务名:“xmpp” 初始序列:初始实体 供一个开放 XML 流头后,并 ...

  7. 25个增强iOS应用程序性能的提示和技巧(高级篇)(1)

    25个增强iOS应用程序性能的提示和技巧(高级篇)(1) 2013-04-16 14:56 破船之家 beyondvincent 字号:T | T 在开发iOS应用程序时,让程序具有良好的性能是非常关 ...

  8. db2 Hidden columns

    When a table column is defined with the implicitly hidden attribute, that column is unavailable unle ...

  9. JAVA作业02

    一,      课堂练习 (一)构造方法 1,源代码 public class Test{ public static void main(String[] args){ Foo obj1=new F ...

  10. jQuery – 6.选择器

    1. 属性过滤选择器: 1. $("div[id]")选取有id属性的<div> 2. $("div[title=test]")选取title属性为 ...