Disney's FastPass

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2336    Accepted Submission(s):
644

Problem Description

Disney's FastPass is a virtual queuing system
created by the Walt Disney Company. First introduced in 1999 (thugh the idea of
a ride reservation system was first introduced in world fairs), Fast-Pass allows
guests to avoid long lines at the attractions on which the system is installed,
freeing them to enjoy other attractions during their wait. The service is
available at no additional charge to all park guests.
---
wikipedia


Disneyland is a large theme park
with plenties of entertainment facilities, also with a large number of tourists.
Normally, you need to wait for a long time before geting the chance to enjoy any
of the attractions. The FastPass is a system allowing you to pick up
FastPass-tickets in some specific position, and use them at the corresponding
facility to avoid long lines. With the help of the FastPass System, one can
arrange his/her trip more efficiently.
You are given the map of the whole
park, and there are some attractions that you are interested in. How to visit
all the interested attractions within the shortest time?

 
Input
The first line contains an integer T(1<=T<=25),
indicating the number of test cases.
Each test case contains several
lines.
The first line contains three integers N,M,K(1 <= N <= 50; 0
<= M <= N(N - 1)/2; 0 <= K <= 8), indicating the number of
locations(starting with 1, and 1 is the only gate of the park where the trip
must be started and ended), the number of roads and the number of interested
attractions.
The following M lines each contains three integers A,B,D(1 <=
A,B <= N; 0 <= D <= 10^4) which means it takes D minutes to travel
between location A and location B.
The following K lines each contains
several integers Pi, Ti, FTi,Ni,
Fi,1, Fi,2 ... Fi,Ni-1, FiNi ,(1
<= Pi,Ni, Fi,j <=N, 0 <=
FTi <= Ti <= 10^4), which means the ith interested
araction is placed at location Pi and there are Ni locations Fi,1;
Fi,2 ... Fi,Ni where you can get the FastPass
for the ith attraction. If you come to the ith attraction with its FastPass, you
need to wait for only FTi minutes, otherwise you need to wait for Ti
minutes.
You can assume that all the locations are connected and there is at
most one road between any two locations.
Note that there might be several
attrractions at one location.
 
Output
For each test case in the input, print one line: "Case
#X: Y", where X is the test case number (starting with 1) and Y is the minimum
time of the trip.
 
Sample Input
2
4 5 2
1 2 8
2 3 4
3 4 19
4 1 6
2 4 7
2 25 18 1 3
4 12 6 1 3
4 6 2
1 2 5
1 4 4
3 1 1
3 2 1
3 4 1
2 4 10
2 8 3 1 4
4 8 3 1 2
 
Sample Output
Case #1: 53
Case #2: 14
 
题意:游戏园里有N个区域,有M条边连接这N个区域,有K个要访问的景点。对于每个景点告诉你这个景点所在的区域,要访问这个景点需要等待一定时间,如果没有FastPass,等待时间有Ti,否则等待时间为FTi,接下来的Ni,表示有Ni个区域可以得到这个景点的FastPass,问从区域1出发,再回到区域1所需要的最少时间。
 
第一次写状态压缩,参照别人的代码。首先是floyd预处理出任意两点之间的最短距离。dp[state1][state2][u]表示在该状态state1(已经访问过的景点)、state2(手中有的景点的票)、目前所在的位置时所花费的时间的最小值,于是答案就是dp[(1<<k)-1][state][1]了(0<=state<(1<<n))。
 
附上代码:
 
 #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#define INF 0x3f3f3f3f
#define M
#define N 60
using namespace std;
int n,m,k,ans;
int map[N][N];
int p[N],t[N],ft[N],pass[N];
int dp[<<][<<][N]; void floyd()
{
int i,j,k;
for(k=; k<=n; k++)
for(i=; i<=n; i++)
for(j=; j<=n; j++)
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
} void Get_Dp()
{
int i,j,u,v;
for(i=; i<=(<<k); i++)
for(j=; j<=(<<k); j++)
for(u=; u<=n; u++)
dp[i][j][u]=INF;
dp[][][]=;
for(int state1=; state1<(<<k); state1++)
{
for(int state2=; state2<(<<k); state2++)
{
for(u=; u<=n; u++)
{
if(dp[state1][state2][u]<INF)
{
for(i=; i<k; i++)
{
if(!(state1&(<<i))) ///单独取state1的每一位数字
{
int cost=map[u][p[i]];
if((state2&(<<i))) cost+=ft[i];
else cost+=t[i];
dp[state1|(<<i)][state2|pass[p[i]]][p[i]]=min(dp[state1|(<<i)][state2|pass[p[i]]][p[i]],dp[state1][state2][u]+cost);
}
}
for(v=; v<=n; v++)
{
dp[state1][state2|pass[v]][v]=min(dp[state1][state2|pass[v]][v],dp[state1][state2][u]+map[u][v]);
}
}
}
}
}
ans=INF;
for(i=; i<(<<k); i++)
ans=min(ans,dp[(<<k)-][i][]);
} int main()
{
int i,j,T,cas,num,v;
scanf("%d",&T);
for(cas=; cas<=T; cas++)
{
scanf("%d%d%d",&n,&m,&k);
for(i=; i<=n; i++)
for(j=; j<=n; j++)
if(i==j) map[i][j]=;
else map[i][j]=INF;
int a,b,c;
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c)
map[a][b]=c,map[b][a]=c;
}
floyd();
memset(pass,,sizeof(pass));
for(i=; i<k; i++)
{
scanf("%d%d%d%d",&p[i],&t[i],&ft[i],&num);
while(num--)
{
scanf("%d",&v);
pass[v]|=(<<i); ///没有进位的加法
}
}
Get_Dp();
printf("Case #%d: %d\n",cas,ans);
}
return ;
}

hdu 4114 Disney's FastPass(最短路+状态压缩)的更多相关文章

  1. hdu 4114 Disney's FastPass 状压dp

    Disney's FastPass Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.ph ...

  2. [hdu P4114] Disney's FastPass

    [hdu P4114] Disney's FastPass Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  3. Light OJ 1316 A Wedding Party 最短路+状态压缩DP

    题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...

  4. 最短路+状态压缩dp(旅行商问题)hdu-4568-Hunter

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4568 题目大意: 给一个矩阵 n*m (n m<=200),方格里如果是0~9表示通过它时要花 ...

  5. HDU 3605:Escape(最大流+状态压缩)

    http://acm.hdu.edu.cn/showproblem.php?pid=3605 题意:有n个人要去到m个星球上,这n个人每个人对m个星球有一个选择,即愿不愿意去,"Y" ...

  6. HDU 2809 God of War(DP + 状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2809 题目大意:给出战神吕布的初始攻击力ATI.防御力DEF.生命值HP.每升一级增加的攻击力In_A ...

  7. POJ 3311 Hie with the Pie (BFS+最短路+状态压缩)

    题意:类似于TSP问题,只是每个点可以走多次,求回到起点的最短距离(起点为点0). 分析:状态压缩,先预处理各点之间的最短路,然后sum[i][buff]表示在i点,状态为buff时所耗时...... ...

  8. hdu 4352 XHXJ's LIS 数位dp+状态压缩

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others ...

  9. hdu - 1429 胜利大逃亡(续) (bfs状态压缩)

    http://acm.hdu.edu.cn/showproblem.php?pid=1429 终于开始能够做状态压缩的题了,虽然这只是状态压缩里面一道很简单的题. 状态压缩就是用二进制的思想来表示状态 ...

随机推荐

  1. Linux下根目录root扩容

    参考博客:https://blog.csdn.net/qq_36527339/article/details/81772996 1.首先虚拟机关机 —> 选中要扩容的虚拟机 —>编辑虚拟机 ...

  2. day18 13.乐观锁介绍

    乐观锁是使用版本字段,悲观锁是使用数据库底层的锁机制.mysql的类型timestamp(时间戳)有一个特点:插入数据不用管我,我取系统当前默认值.timestamp插入时间会记录,修改时间也会记录. ...

  3. python 从数据库取回来的数据中文显示为乱码

    问题:从数据库取回来的数据,中文显示为乱码. 解决办法: 此处要指定charset为utf-8(一般数据库编码都是utf8),否则读取出的中文会乱码

  4. Ubuntu下安装go语言

    参考:http://golang.org/doc/install/source 1. 下载go源代码 sudo apt-get install mercurial hg clone -u releas ...

  5. Linux下安装配置git

    参考博客: https://www.cnblogs.com/luhouxiang/p/5801853.html但执行git --version命令会出现 git version 1.8.3.1 不是最 ...

  6. Windows系统MySQL8.0的安装教程

    MySQL推出的8.0版本亮点多多,尤其是两倍的提速更让我们迫不及待地安装一睹为快.然而目前我们所用的版本还在5.7之前,今天小编给家分享一下MySQL8.0的安装,尤其是多版本MySQL的共存. 方 ...

  7. uni-app官方教程学习手记

    本人微信公众号:前端修炼之路,欢迎关注 背景介绍 大概在今年的十月份左右,我了解到Dcloud推出了uni-app.当时下载了一个Hbuilder X,下载了官方提供的hello示例教程.经过一番努力 ...

  8. npm上面实用的第三方工具包

    npm上面实用的第三方工具包 live-server 作用:为页面提供实时刷新重载的功能,并且能提供一个http服务器 官方地址:https://www.npmjs.com/package/live- ...

  9. [运维]Dell R710 raid配置 标签: raid运维 2017-04-15 19:35 581人阅读 评论(16)

    Dell R系列的一些服务器,raid的配置都大同小异,公司大部分的服务器,都是Dell R710型号的,这个型号的raid界面配置起来还是很简单的,下面来跟随小编体验一下raid如何配置吧.ps:图 ...

  10. ThInkPHP加密和解密cookie(登录操作)

    摘自:http://www.thinkphp.cn/code/1794.html 通过加密cookie是网站安全性更高,登录信息不保存在session中在function.php文件在建立两个函数,加 ...