LightOJ1316 A Wedding Party(状压DP)
这题事实上只需要关心15个商店和一个起点一个终点,预处理出这几个点之间的最短距离。Floyd会超时,用Dijkstra即可。
然后就是dp[u][S]表示已经经过商店集合S且当前在第u个商店所花的最少时间。
最后的结果是找到所有dp[u][S]有解且u能到达终点的最大的|S|,而最短时间就是dp[u][S]+dist[u][vt]。
细节还挺多的。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF (1<<29) int d[][<<];
int G[][],dist[][],shop[];
void dijkstra(int vs,int n){
for(int i=; i<n; ++i) dist[vs][i]=INF;
dist[vs][vs]=;
bool vis[]={};
for(int i=; i<n; ++i){
int u=-,mm=INF;
for(int v=; v<n; ++v){
if(!vis[v] && mm>dist[vs][v]){
mm=dist[vs][v];
u=v;
}
}
if(u==-) break;
vis[u]=;
for(int v=; v<n; ++v){
if(!vis[v] && G[u][v]!=INF && dist[vs][v]>dist[vs][u]+G[u][v]){
dist[vs][v]=dist[vs][u]+G[u][v];
}
}
}
}
int getCnt(int s){
int res=;
for(int i=; i<; ++i){
if((s>>i)&) ++res;
}
return res;
}
int cnt[<<];
int main(){
for(int i=; i<(<<); ++i) cnt[i]=getCnt(i);
int t,n,m,s,a,b,c;
scanf("%d",&t);
for(int cse=; cse<=t; ++cse){
scanf("%d%d%d",&n,&m,&s);
for(int i=; i<n; ++i){
for(int j=; j<n; ++j) G[i][j]=INF;
}
for(int i=; i<s; ++i) scanf("%d",&shop[i]);
while(m--){
scanf("%d%d%d",&a,&b,&c);
G[a][b]=min(G[a][b],c);
}
dijkstra(,n);
for(int i=; i<s; ++i) dijkstra(shop[i],n); if(dist[][n-]==INF){
printf("Case %d: Impossible\n",cse);
continue;
} for(int i=; i<s; ++i){
for(int j=; j<(<<s); ++j) d[i][j]=INF;
}
for(int i=; i<s; ++i){
d[i][<<i]=dist[][shop[i]];
}
for(int i=; i<(<<s); ++i){
for(int j=; j<s; ++j){
if(((i>>j)&)==) continue;
for(int k=; k<s; ++k){
if(k==j || ((i>>k)&)==) continue;
d[j][i]=min(d[j][i],d[k][i^(<<j)]+dist[shop[k]][shop[j]]);
}
}
}
int mx=,mm=INF;
for(int i=; i<(<<s); ++i){
for(int j=; j<s; ++j){
if(d[j][i]==INF || dist[shop[j]][n-]==INF) continue;
mx=max(mx,cnt[i]);
}
}
for(int i=; i<(<<s); ++i){
for(int j=; j<s; ++j){
if(d[j][i]==INF) continue;
if(cnt[i]==mx) mm=min(mm,d[j][i]+dist[shop[j]][n-]);
}
}
if(mm!=INF) printf("Case %d: %d %d\n",cse,mx,mm);
else printf("Case %d: 0 %d\n",cse,dist[][n-]);
}
return ;
}
LightOJ1316 A Wedding Party(状压DP)的更多相关文章
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
- 【BZOJ2073】[POI2004]PRZ 状压DP
[BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
- HDU 1074 Doing Homework (状压dp)
题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...
- 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP
[BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...
- 【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP
[BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M< ...
- 【BZOJ1087】 [SCOI2005]互不侵犯King 状压DP
经典状压DP. f[i][j][k]=sum(f[i-1][j-cnt[k]][k]); cnt[i]放置情况为i时的国王数量 前I行放置情况为k时国王数量为J #include <iostre ...
随机推荐
- Android Toast 封装,避免Toast消息覆盖,替换系统Toast最好用的封装
Android Toast 封装,避免Toast消息覆盖,无阻塞,等强大功能 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
- 淘宝(阿里百川)手机客户端开发日记第六篇 Service详解(一)
public abstract class Service; [API文档关于Service类的介绍] A Service is an application component representi ...
- 诠释Linux中『一切都是文件』概念和相应的文件类型
导读 在 Unix 和它衍生的比如 Linux 系统中,一切都可以看做文件.虽然它仅仅只是一个泛泛的概念,但这是事实.如果有不是文件的,那它一定是正运行的进程. 要理解这点,可以举个例子,您的根目录( ...
- IOS项目删除Git
默认创建工程会在MAC上面创建Git版本管理, 但是呢, 我现在想上传到svn服务器进行管理, 但是已经有个git 好像上传不了 只有把Git删了才能继续. 连问带查, 终于找到解决方案 把 .git ...
- node.js模拟qq漂流瓶
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) node.js模拟简易漂流瓶,页面有扔瓶子和捡瓶子的功能,一个瓶子只能被捡到一次,阅读完就置状态位, ...
- [POJ1003]Hangover
[POJ1003]Hangover 试题描述 How far can you make a stack of cards overhang a table? If you have one card, ...
- Firemonkey的旁门左道[六]
转载:http://blog.csdn.net/qustdong/article/details/9992033 今天还是讲讲和图形有关的事情,这次的难度再增加些,不是直接改源代码了, 而是通过RTT ...
- i686和x86_64的区别
找回TCL隐藏分区(转载) 用Wubi安装 Ubuntu 出现(Initranfs)问题的解决方案 i686和x86_64的区别 2009-04-11 08:19:31| 分类: 电脑问题 | 标 ...
- Java for LeetCode 064 Minimum Path Sum
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...
- NEFU 1146 又见A+B
又见a+b Problem:1146 Time Limit:1000ms Memory Limit:65535K Description 给定两个非负整数A,B,求他们的和. Input 多组输入,每 ...