Travel(HDU 4284状压dp)
题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走,一个城市只能工作一次,问pp是否能游览n个城市回到城市1.
分析:这个题想到杀怪(Survival(ZOJ 2297状压dp)
那个题,也是钱如果小于0就挂了,最后求剩余的最大钱数,先求出最短路和
Hie with the Pie(POJ 3311状压dp)
送披萨那个题相似。
#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <string>
#include <cctype>
#include <complex>
#include <cassert>
#include <utility>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
#define lson l,m,rt<<1
#define pi acos(-1.0)
#define rson m+1,r,rt<<11
#define All 1,N,1
#define read freopen("in.txt", "r", stdin)
#define N 1<<16
#define INF 99999999
const int mod = 1000000007;
int n,m,money,tn;
int dp[N][20],cost[120][120];
struct city{
int in,c,d;
}t[20];
void floyd(){
for(int k=1;k<=tn;++k)
for(int i=1;i<=tn;++i)
for(int j=1;j<=tn;++j)
cost[i][j]=min(cost[i][j],cost[i][k]+cost[k][j]);
}
void solve(){
int cas=(1<<n)-1;
for(int i=0;i<=cas;++i)
for(int j=0;j<n;++j)
dp[i][j]=-INF;
for(int i=0;i<n;++i)
if(money>=cost[1][t[i].in]+t[i].d)
dp[1<<i][i]=money-cost[1][t[i].in]-t[i].d+t[i].c;
for(int i=1;i<=cas;++i)
for(int j=0;j<n;++j){
if(dp[i][j]==-INF||!(i&(1<<j)))continue;
for(int k=0;k<n;++k){
if(j==k)continue;
int c=cost[t[j].in][t[k].in]+t[k].d;
if(!(i&(1<<k))&&dp[i][j]>=c){
int tot=dp[i][j]-c+t[k].c;
dp[i|(1<<k)][k]=max(dp[i|(1<<k)][k],tot);
}
}
}
int f=0;
for(int i=0;i<n;++i)
if(dp[cas][i]>=cost[1][t[i].in]){
// cout<<dp[cas][i]<<endl;
f=1;
break;
}
if(f)printf("YES\n");
else printf("NO\n");
}
int main()
{
int te;
scanf("%d",&te);
while(te--){
scanf("%d%d%d",&tn,&m,&money);
for(int i=0;i<=tn;++i)
for(int j=0;j<=tn;++j)
{
if(i==j)cost[i][j]=0;
else cost[i][j]=INF;
}
int u,v,c;
for(int i=0;i<m;++i){
scanf("%d%d%d",&u,&v,&c);
cost[u][v]=cost[v][u]=min(cost[u][v],c);
}
floyd();
scanf("%d",&n);
for(int i=0;i<n;++i)
scanf("%d%d%d",&t[i].in,&t[i].c,&t[i].d);
solve();
}
return 0;
}
Travel(HDU 4284状压dp)的更多相关文章
- HDU 4284 状压dp+spfa
题意: 给定n个点 m条无向边 d元. 以下m行表示每条边 u<=>v 以及花费 w 以下top 以下top行 num c d 表示点标为num的城市 工资为c 健康证价格为d 目标是经过 ...
- hdu 4284(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4284 思路:类似于poj3311:http://poj.org/problem?id=3311,首先f ...
- HDU 4778 状压DP
一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...
- HDU - 4284 Travel(floyd+状压dp)
Travel PP loves travel. Her dream is to travel around country A which consists of N cities and M roa ...
- HDU 3001 状压DP
有道状压题用了搜索被队友骂还能不能好好训练了,, hdu 3001 经典的状压dp 大概题意..有n个城市 m个道路 成了一个有向图.n<=10: 然后这个人想去旅行.有个超人开始可以把他扔到 ...
- hdu 2809(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2809 思路:简单的状压dp,看代码会更明白. #include<iostream> #in ...
- hdu 2167(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2167 思路:经典的状压dp题,前后,上下,对角8个位置不能取,状态压缩枚举即可所有情况,递推关系是为d ...
- Engineer Assignment HDU - 6006 状压dp
http://acm.split.hdu.edu.cn/showproblem.php?pid=6006 比赛的时候写了一个暴力,存暴力,过了,还46ms 那个暴力的思路是,预处理can[i][j]表 ...
- hdu 3254 (状压DP) Corn Fields
poj 3254 n乘m的矩阵,1表示这块区域可以放牛,0,表示不能,而且不能在相邻的(包括上下相邻)两个区域放牛,问有多少种放牛的方法,全部不放也是一种方法. 对于每块可以放牛的区域,有放或者不放两 ...
随机推荐
- Java字符串之性能优化
基础类型转化成String 在程序中你可能时常会需要将别的类型转化成String,有时候可能是一些基础类型的值.在拼接字符串的时候,如果你有两个或者多个基础类型的值需要放到前面,你需要显式的将第一个值 ...
- 为什么dubbo使用ZkClient作为zookeeper的客户端
本文内容并非原创,使用资料均来自互联网. dubbo使用了zkClient而不是使用zookeeper本身的客户端与zookeeper进行交互,为什么呢? 先看看zookeeper本身自带的客户端的问 ...
- Unity3D中Ragdoll的用法
一.创建Ragdoll 见unity3d组件文档里的Ragdoll Wizard.由于unity3d中的Ragdoll设置的骨骼点名字与3DMAX里人体骨骼命名有些不一样,下图为Unity3 ...
- bnuoj 1057 函数(模拟)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=1057 [题意]:给定x的值,带入f(x)求函数值 [题解]:注意第一个数的符号可能是'+',这里把我 ...
- Spring aop与HibernateTemplate——session管理(每事务一次 Session)
一.HibernateTemplate与Spring aop简介 参见http://bbs.csdn.net/topics/340207475中网友blueram的发言.(感谢blueram) 二.在 ...
- 【高斯消元】BZOJ 1013: [JSOI2008]球形空间产生器sphere
Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁 ...
- BZOJ 4127 Abs 解题报告
这个题感觉很厉害的样子.. 首先我们注意到一点:每次加的 $d$ 都是非负的. 那么就说明一个数只可能从负数变成非负数并且只会变一次. 所以我们就可以暴力地去改变一个数的正负情况. 然后我们就可以用树 ...
- Educational Codeforces Round 5 A
Problem A:http://codeforces.com/contest/616/problem/A A. Comparing Two Long Integers 果然还是我太天真了(长整数比较 ...
- 手工、工具分别实现cookie注入
最开始的判断access类型的网站注入点可以用“1 and 1=1”来判断. 不过现在的网站基本上被挡住了.之后呢,可以考虑cookie注入. Dim Tc_Post,Tc_Get,Tc_In,Tc_ ...
- PHP程序员函数注释规格
<?php/*** @name 名字* @abstract 申明变量/类/方法* @access 指明这个变量.类.函数/方法的存取权限* @author 函数作者的名字和邮箱地址* @cate ...