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 ...
随机推荐
- poj 1220(短除法)
http://poj.org/problem?id=1220 题意:进制转换,把a进制转换为b进制. 如果数据不大的话,那么这个题还是很简单的,但这个题就是数据范围太大,所以这里可以采用短除法来做. ...
- android SDK manager 无法获取更新版本列表
打开SDK Manager---Tools---Options,填入如下代理和端口,勾选选项也如下. 网址:mirrors.neusoft.edu.cn 端口:80 99%是成功的 参考:http:/ ...
- 给一个正在运行的Docker容器动态添加Volume
给一个正在运行的Docker容器动态添加Volume本文转自:http://dockone.io/article/149 [编者的话]之前有人问我Docker容器启动之后还能否再挂载卷,考虑到mnt命 ...
- ACM/ICPC 之 树形DP(POJ1192)
将某点看做根状态,邻接点看做子状态,由子状态向根状态转移. POJ1192-最优连通子集 题解:将每一个点分成两个状态进行保存,因此可以构造一个数组dp[i][2]. dp[i][0]:不包括该点权值 ...
- java入门 第三季2
java中的字符串 java中的常用类
- manage account
#!/bin/bash # #Delete_user - Automates the steps to remove an account # ############################ ...
- css 命名规范
网站头部: head/header(头部) top(顶部) 导航: nanv 导航具体区分:topnav(顶部导航).mainnav(主导航).mininav(迷你导航).textna ...
- vs2010 快捷键大全
vs2010 快捷键大全 VS2010版快捷键 Ctrl+E,D ----格式化全部代码 Ctrl+E,F ----格式化选中的代码 CTRL + SHIFT + B生成解决方案 CTRL + F7 ...
- bootstrap日期控件在火狐下的模态框中选择时间下拉菜单无效的解决办法
今天收到程序组提交的一个兼容BUG,在火狐中使用模态框加载日期控件时选择时间下拉菜单没有效果(不能点击),而在谷歌中却是好的, 排错思路:1,在当前页面主层放置一个时间控件,测试通过 2,在ajax加 ...
- Oracle基础函数
--1,大小写控制函数 SELECT LOWER('Hello World') 转小写, UPPER('Hello World') 转大写, INITCAP('hello world') 首字母大写 ...