题意: 给了一个图 从1号节点走到N号节点,然后,每个地方有买卖盐的差价,然后求 到达N的最大价值,一旦走到N这个点就不能再走了,或者走到不能再别的世界走1和N这两个点,然后接下来

用一个 四维的数组记录状态,因为时间是递增的 也就是说不会出现循环,我们每次选取最小的时间来做,这样可以避免很多不必要的状态去搜索,要转移到别的点的时候后 考虑这个状态买卖盐和什么都不做,的转移到别人那,

#include <iostream>
#include <algorithm>
#include <string.h>
#include <vector>
#include <queue>
#include <cstdio>
using namespace std;
typedef long long LL;
int G;
struct point{
int un,loc,bl,ti;
point(int cuniver=,int cloc=,int cblat=,int ct=)
{
un=cuniver;
loc=cloc;
bl=cblat;
ti=ct;
}
bool operator <(const point &rhs)const{
return ti>rhs.ti;
}
};
int dp[][][][];
int H[],nx[],to[],numofE,tim[];
int dist[];
int N,M,B,K,R,T;
void init(int n)
{
numofE=;
memset(H,,sizeof(H));
memset(dp,-,sizeof(dp));
}
int price[][];
void add(int a, int b, int t, int m)
{
numofE++;
dist[numofE]=m;
tim[numofE]=t;
to[numofE]=b;
nx[numofE]=H[a];
H[a]=numofE;
}
bool in[][][][];
priority_queue<point> Q;
void jin(point per, point now,int S)
{
if(now.bl<=B&&S-price[per.un][per.loc]>dp[now.un][now.loc][now.bl][now.ti])
{
dp[ now.un ][ now.loc ][ now.bl ][ now.ti ]=S-price[per.un][per.loc];
if(in[now.un][now.loc][now.bl][now.ti]==false)
{
in[now.un][now.loc][now.bl][now.ti]=true;
Q.push(now);
}
}
}
void chu(point per, point now, int S)
{
if(now.bl>=&&S+price[per.un][per.loc]>dp[now.un][now.loc][now.bl][now.ti])
{
dp[ now.un ][ now.loc ][ now.bl ][ now.ti ]=S+price[per.un][per.loc];
if(in[now.un][now.loc][now.bl][now.ti]==false)
{
in[now.un][now.loc][now.bl][now.ti]=true;
Q.push(now);
}
}
}
void bfs()
{
dp[][][][]=R;
memset(in,false,sizeof(in));
Q.push(point(,,,));
in[][][][]=true;
point pp,tmp;
while(!Q.empty()){
tmp=Q.top();Q.pop();
int S=dp[tmp.un][tmp.loc][tmp.bl][tmp.ti];
if( tmp.ti>=T || tmp.loc==N ) continue;
if( tmp.loc!= && tmp.loc!=N )
{
int H=(tmp.un+)%K;
if( tmp.ti + <= T)
{ pp.bl=tmp.bl; pp.loc=tmp.loc;
pp.ti=tmp.ti+;pp.un=H;
if( S > dp[ pp.un ][ pp.loc ][ pp.bl ][ pp.ti ] )
{
dp[pp.un][pp.loc][pp.bl][pp.ti]=S;
if(in[pp.un][pp.loc][pp.bl][pp.ti]==false)
{
Q.push(pp);
in[pp.un][pp.loc][pp.bl][pp.ti]=true;
}
}
pp.bl=tmp.bl+;
jin(tmp,pp,S);
pp.bl=tmp.bl-;
chu(tmp,pp,S);
}
}
for(int i=H[tmp.loc]; i; i=nx[i])
{
int tt=to[i];
if(tmp.un!=&&(tt==||tt==N))continue;
pp.un=tmp.un;pp.loc=tt;
pp.ti=tmp.ti+tim[i]; pp.bl=tmp.bl;
int cost=S-dist[i];
if(pp.ti>T)continue;
if(cost>dp[pp.un][pp.loc][pp.bl][pp.ti])
{
dp[pp.un][pp.loc][pp.bl][pp.ti]=cost;
if(in[pp.un][pp.loc][pp.bl][pp.ti]==false)
{
in[pp.un][pp.loc][pp.bl][pp.ti]=true;
Q.push(pp);
}
}
if(tmp.loc!=&&tmp.loc!=N)
{
pp.bl=tmp.bl+;
jin(tmp,pp,cost);
pp.bl=tmp.bl-;
chu(tmp,pp,cost);
} }
}
}
int main()
{
int cas;
scanf("%d",&cas);
for(int cc=; cc<=cas; cc++)
{
G=;
scanf("%d%d%d%d%d%d",&N,&M,&B,&K,&R,&T);
init(N);
for(int i=; i<K; i++)
{
for(int j=; j<=N; j++)
scanf("%d",&price[i][j]);
}
for(int i=; i<M; i++)
{
int a,b,t,m;
scanf("%d%d%d%d",&a,&b,&t,&m);
add(a,b,t,m);
}
bfs();
int ans=-;
for(int i=; i<=T; i++)
for(int j=; j<=B; j++)
ans=max(ans,dp[][N][j][i]);
if(ans==-){
printf("Case #%d: Forever Alone\n",cc);
}else{
printf("Case #%d: %d\n",cc,ans);
}
}
return ;
}

hdu4784的更多相关文章

  1. HDU4784 Dinner Coming Soon(dp)

    当时区域赛的一道题.题意大概是这样的,有一个1~N的图,然后你要从1->N,其中每经过一条边需要消耗你的时间和金钱,每到一个地方可以选择什么都不做,或者买一包盐,卖一包盐,身上不能同时有超过B包 ...

  2. HDU--4784 Dinner Coming Soon DP+BFS

    题意非常长非常变态.一个人要到他男朋友家,他最初有R元以及T分钟的时间来赶到他男朋友家.有N个房子M条道路,每条道路有须要消耗的时间以及过路费,同一时候还要顺路做食盐生意,起初身上没有食盐,最多带B袋 ...

  3. hdu4784 不错的搜索( 买卖盐,要求整钱最多)

    题意:       给你一个有向图,每个节点上都有一个盐价,然后给你k个空间,么个空间上节点与节点的距离不变,但盐价不同,对于每一个节点,有三种操作,卖一袋盐,买一袋盐 ,不交易,每一个节点可以跳掉( ...

  4. The 2013 ACMICPC Asia Regional Chengdu

    还有19天出发北京站,今年北京站的出题方是上交,去年他们出的成都现场的赛题,首先复盘一下. 去年的成都是我经历的第一次现场赛,也是近距离第一次见到了CLJ的真人,最后也是被虐惨了,那时候是声闻大神带着 ...

随机推荐

  1. BZOJ1280 Emmy卖猪pigs 网络流

    正解:网络流 解题报告: 传送门! 我网络流的基础题都还麻油做完就来做这个了,,,wsl,,, 首先想下最基础的构图方法 不难想到把猪圈和顾客分别当做节点,然后新建一个源点和汇点 然后考虑怎么连边,首 ...

  2. Swift中"#"的用法

    配置外部参数名 在函数(或者方法)的参数名前添加"#",可以使该参数拥有相同的本地参数名和外部参数名. 注:在方法中,第二个及后续的参数,默认是具有和内部参数一致的外部参数名的,只 ...

  3. JavaScript 数组(Array)对象

    1.Array相关的属性和方法 Array对象属性 constructor 返回对创建此对象的数组函数的引用: length 设置或返回数组中元素的数目: prototype 使您有能力向对象添加属性 ...

  4. ios多播委托

    在现实中回调的需求也分两种 一对一的回调. 一对多的回调. 对于一对一的回调,在IOS中使用delegate.block都能实现.而一对多的回调基本就是通知中心了. 假如现在有一个需求,我们以图片下载 ...

  5. [Android][Android Studio] Gradle项目中加入JNI生成文件(.so文件)

    版权声明:本文作者:Qiujuer https://github.com/qiujuer; 转载请注明出处,盗版必究! ! ! https://blog.csdn.net/qiujuer/articl ...

  6. docker+jenkins的构建历史记录(Build History)时间不正确

    1.分别查看宿主机时间和容器时间 宿主机时间 root@fcaad17f146a:/# date Fri Jan :: CST 容器时间 [root@ ~]# docker exec -ti 8798 ...

  7. 腾讯游戏DBA团队的发展自白

    BA这个岗位跟仓管员很像,就是每天给别人发点货,别人在你这儿放点货,DBA工作就是把货尽快给送出去或者让人家尽快放进来.当然,还有一份重要的工作,就是让仓库里摆放的货物尽可能整齐,这也是仓管员的本职工 ...

  8. 流程控制之if...else

    # #如果:男的年龄>49,那么:小哥哥## age_of_boy = 50# if age_of_boy > 49:# print('小哥哥你好')### # 如果:女人的年龄>3 ...

  9. JavaScript 全栈工程师培训教程 - 阮一峰

    http://www.ruanyifeng.com/blog/2016/11/javascript.html https://github.com/ruanyf/jstraining 我现在的技术方向 ...

  10. Hive和SparkSQL:基于 Hadoop 的数据仓库工具

    Hive 前言 Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,将类 SQL 语句转换为 MapReduce 任务执行. ...