hdu 4784 Dinner Coming Soon
spfa+优先队列。刚开始只用的spfa,结果tle到死。然后听队友说要用到优先队列,想了想,对时间分层的话的确每一个结点都只进队列一次即可,因为只有大时间才能更新出小时间,然后就wa成shi了。按队友写的改了才过得,好伤心的说,这是好题。。。
附上代码供大家对拍吧。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#define LL long long
#define CLR(a, b) memset(a, b, sizeof(a))
#define REP(i, n) for(int i = 0; i < n; i ++)
#define FF(i, a, b) for(int i = a; i < b; i ++)
#define FD(i, a, b) for(int i = a; i >= b; i --)
#define swp(a, b) a^=b^=a^=b; using namespace std; struct Node
{
int u, b, vd, t;
Node(){}
Node(int a, int b, int c, int d):u(a), b(b), vd(c), t(d){}
bool operator < (const Node &rhs) const
{
return t < rhs.t;
}
}; struct Edge
{
int u, v, t, m;
Edge(){}
Edge(int a, int b, int c, int d):u(a), v(b), t(c), m(d){}
}E[420]; int fir[220], next[440], tot; void Add_Edge(int u, int v, int t, int m)
{
E[tot] = Edge(u, v, t, m);
next[tot] = fir[u]; fir[u] = tot ++;
} int dp[110][6][7][220];
bool vis[110][6][7][220];
int p[110][7];
int N, M, B, K, R, T; priority_queue<Node>q; void relax(int u, int b, int vd, int t, int val)
{
if ((u == 1 || u == N) && vd != 0) return ;
if(dp[u][b][vd][t] < val)
{
dp[u][b][vd][t] = val;
if(!vis[u][b][vd][t])
{
Node w = Node(u, b, vd, t);
q.push(w);
vis[u][b][vd][t] = true;
}
}
} void spfa()
{
int u, v, m, t,vd, b;
Node a = Node(1, 0, 0, T);
CLR(dp, -1);CLR(vis, false);
dp[1][0][0][T] = R;
vis[1][0][0][T] = true;
q.push(a);
while(!q.empty())
{
a = q.top();q.pop();
u = a.u;b = a.b;vd = a.vd;t = a.t;
if(u == N) continue;
if(t > 0)
{
int val = dp[u][b][vd][t];
relax(u, b, (vd + 1) % K, t - 1, val);
if(p[u][vd] != -1)
{
if(b > 0)
{
relax(u, b - 1, (vd + 1) % K, t - 1, val + p[u][vd]);
}
if(b < B && val >= p[u][vd])
{
relax(u, b + 1, (vd + 1) % K, t - 1, val - p[u][vd]);
}
}
}
for(int i = fir[u]; ~i; i = next[i])
{
int tmp = t - E[i].t;
if(tmp < 0) continue;
v = E[i].v;
int val = dp[u][b][vd][t] - E[i].m;
if(val < 0) continue;
relax(v, b, vd, tmp, val);
if(p[u][vd] != -1)
{
if(b > 0)
{
relax(v, b - 1, vd, tmp, val + p[u][vd]);
}
if(b < B && val >= p[u][vd])
{
relax(v, b + 1, vd, tmp, val - p[u][vd]);
}
}
}
}
} int main()
{
int Time, cas = 1;
scanf("%d", &Time);
while(Time --)
{
scanf("%d%d%d%d%d%d", &N, &M, &B, &K, &R, &T);
for(int i = 0; i < K; i ++)
{
for(int j = 1; j <= N; j ++)
{
scanf("%d", &p[j][i]);
}
}
CLR(fir, -1);tot = 0;
int u, v, t, m;
for(int i = 0; i < M; i ++)
{
scanf("%d%d%d%d", &u, &v, &t, &m);
Add_Edge(u, v, t, m);
}
spfa();
int ans = -1;
for(int i = 0; i <= B; i ++)
{
for(int j = 0; j <= T; j ++)
{
ans = max(ans, dp[N][i][0][j]);
}
}
if(ans != -1) printf("Case #%d: %d\n", cas ++, ans);
else printf("Case #%d: Forever Alone\n", cas ++);
}
}
hdu 4784 Dinner Coming Soon的更多相关文章
- hdu 4784 Dinner Coming Soon(spfa + 优先队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4784 思路:建图,对于同一个universe来说,就按题目给的条件相连,对于相邻的universe,连 ...
- The 2013 ACMICPC Asia Regional Chengdu
还有19天出发北京站,今年北京站的出题方是上交,去年他们出的成都现场的赛题,首先复盘一下. 去年的成都是我经历的第一次现场赛,也是近距离第一次见到了CLJ的真人,最后也是被虐惨了,那时候是声闻大神带着 ...
- 怒刷DP之 HDU 1029
Ignatius and the Princess IV Time Limit:1000MS Memory Limit:32767KB 64bit IO Format:%I64d &a ...
- 【并查集专题】【HDU】
PS:做到第四题才发现 2,3题的路径压缩等于没写 How Many Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65 ...
- HDU 1213 How Many Tables(模板——并查集)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1213 Problem Description Today is Ignatius' birthday ...
- HDU 1029 Ignatius and the Princess IV / HYSBZ(BZOJ) 2456 mode(思维题,~~排序?~~)
HDU 1029 Ignatius and the Princess IV (思维题,排序?) Description "OK, you are not too bad, em... But ...
- HDU 2255.奔小康赚大钱 最大权匹配
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU 1213 - How Many Tables - [并查集模板题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 Today is Ignatius' birthday. He invites a lot of ...
- HDU 3045 - Picnic Cows - [斜率DP]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3045 It’s summer vocation now. After tedious milking, ...
随机推荐
- 技术是容易学会的(Copy)
1)自信第一.自信这东西很是奇怪,人有可能一开始会莫明其妙的自信,但一切都从这开始的.你觉得自己行你就一定会变得行,反之,如果觉得自已不行,那一定会不行.信心是我们转动飞轮的第一步,有了这一步我们的能 ...
- jqmobile
标准页面结构 <!DOCTYPE html> <html> <head> <title>Page Title</title> <lin ...
- Android自定义控件(36篇)
http://blog.csdn.net/lmj623565791/article/details/44278417 http://download.csdn.net/user/lmj62356579 ...
- char[]转换成wchar_t的转换方法(GNU Libc规定wchar_t为32位)
wchar_t是C/C++的字符数据类型,是一种扩展的字符存储方式,wchar_t类型主要用在国际化程序的实现中,但它不等同于unicode编码.unicode编码的字符一般以wchar_t类型存储. ...
- qt example
#include"mainwindow.h" #include"ui_mainwindow.h" #include<QWebFrame> #incl ...
- javascript - C++, Qt, QtWebKit: How to create an html rendering window so that your application would get callbacks from JS calls? - Stack Overflow
javascript - C++, Qt, QtWebKit: How to create an html rendering window so that your application woul ...
- Mac OS使用技巧之十五:快捷方便的Mini Dock
Mini Dock是前面忘记了提,这里做一些补充. Mini Dock是Mac OSX的一个值得大书特书的亮点.尽管windows下也有类似的东西,但Mac下却提供了更为全面的功能.通过M ...
- hdu5115 Dire Wolf【区间dp】
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4361169.html ---by 墨染之樱花 [题目链接]http://acm.hdu.e ...
- STL之priority_queue为复合结构排序
priority_queue为复合结构排序: #include <iostream> #include <queue> using namespace std; struct ...
- mysql 中的 IF 和 IFNULL 用法
IFNULL(expr1,expr2) 如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2.IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境. IF(S ...