题意:

给定n个点 m条无向边 d元。

以下m行表示每条边 u<=>v 以及花费 w

以下top

以下top行

num c d 表示点标为num的城市 工资为c 健康证价格为d

目标是经过给定的top个城市,当到达该城市时,必须立即购买该城市的健康证并打工赚钱(每一个城市仅仅打工1次)

问从1城市出发,最后回到1城市,是否能收集到全部的健康证

思路:

因为top非常小,所以状压dp

dp[i][tmp]表示当前处于i点 经过城市的状态为tmp时 身上最多的钱。

首先对dis数组floyd 跑出最短路,然后裸裸地转移。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define ll int
#define inf 100000000
#define N 101 int dp[15][1<<15];
int go[N];
int n, m, d;
int dis[N][N];
int C[N], D[N];
int Stack[N], top;
void floyd(){
for(int z = 1; z <= n; z++)dis[z][z] = 0;
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)if(dis[i][k] !=inf && i!=k)
for(int j = 1; j <= n; j++)if(dis[k][j]!=inf && j!=i && j!=k)
dis[i][j] = min(dis[i][j], dis[i][k]+dis[k][j]);
}
void init(){
memset(dp, -1, sizeof dp);
for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)dis[i][j] = inf;
}
struct node{
int u, t, mon;
node(int a=0,int b=0,int c=0):u(a),t(b),mon(c){}
};
void BFS(){
queue<node>q;
for(int i = 0; i < top; i++) if(d - dis[1][Stack[i]] - D[i]>=0)
q.push(node(Stack[i], go[Stack[i]], d-dis[1][Stack[i]]-D[i]+C[i])); while(!q.empty())
{
node a = q.front(); q.pop();
for(int i = 0; i < top; i++){
int v = Stack[i];
if(a.t & go[v])continue;
node now = a; now.t |= go[v];
if(dp[i][now.t]==-1 && now.mon - dis[a.u][v] - D[i] >= 0)
{
now.mon = now.mon - dis[a.u][v] - D[i] + C[i];
dp[i][now.t] = now.mon;
q.push(now);
}
}
}
}
int main()
{
int i, T, j, u, v, dd;scanf("%d",&T);
while(T--){
scanf("%d %d %d",&n,&m,&d);
init();
while(m--){
scanf("%d %d %d",&u,&v,&dd);
dis[u][v] = dis[v][u] = min(dis[u][v],dd);
}
floyd();
scanf("%d",&top);
for(i=0;i<top;i++){
scanf("%d %d %d",&Stack[i],&C[i],&D[i]);
go[Stack[i]] = 1<<i;
}
BFS();
int ans = -1;
for(i = 0; i < top; i++)
ans = max(dp[i][(1<<top)-1] - dis[1][Stack[i]], ans);
ans>=0?puts("YES"):puts("NO");
}
return 0;
}
/*
2 1 1
1 2 1
2
1 100 1
2 1 0 */

HDU 4284 状压dp+spfa的更多相关文章

  1. Travel(HDU 4284状压dp)

    题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走, ...

  2. hdu 4284(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4284 思路:类似于poj3311:http://poj.org/problem?id=3311,首先f ...

  3. HDU 4778 状压DP

    一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...

  4. HDU 3001 状压DP

    有道状压题用了搜索被队友骂还能不能好好训练了,, hdu 3001 经典的状压dp 大概题意..有n个城市 m个道路  成了一个有向图.n<=10: 然后这个人想去旅行.有个超人开始可以把他扔到 ...

  5. hdu 2809(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2809 思路:简单的状压dp,看代码会更明白. #include<iostream> #in ...

  6. hdu 2167(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2167 思路:经典的状压dp题,前后,上下,对角8个位置不能取,状态压缩枚举即可所有情况,递推关系是为d ...

  7. Engineer Assignment HDU - 6006 状压dp

    http://acm.split.hdu.edu.cn/showproblem.php?pid=6006 比赛的时候写了一个暴力,存暴力,过了,还46ms 那个暴力的思路是,预处理can[i][j]表 ...

  8. 洛谷P2761 软件补丁问题(状压DP,SPFA)

    题意 描述不清... Sol 网络流24题里面怎么会有状压dp?? 真是狗血,不过还是简单吧. 直接用$f[sta]$表示当前状态为$sta$时的最小花费 转移的时候枚举一下哪一个补丁可以搞这个状态 ...

  9. hdu 3254 (状压DP) Corn Fields

    poj 3254 n乘m的矩阵,1表示这块区域可以放牛,0,表示不能,而且不能在相邻的(包括上下相邻)两个区域放牛,问有多少种放牛的方法,全部不放也是一种方法. 对于每块可以放牛的区域,有放或者不放两 ...

随机推荐

  1. oracle 密码文件文件

    密码文件作用: 密码文件用于dba用户的登录认证. dba用户:具备sysdba和sysoper权限的用户,即oracle的sys和system用户. 本地登录: 1)操作系统认证: [oracle@ ...

  2. 深入应用看本质之-ICMP(1)

    在网络层的学习时我们easy忽略IP的一个字段--存活时间 以下是百度上的解释 (8)生存时间 占8位,生存时间字段经常使用的的英文缩写是TTL(Time To Live),表明是数据报在网络中的寿命 ...

  3. oracle 之 内存—鞭辟近里(二)

    overview of the pga pga是在操作系统的进程或是线程特定的一块内存区域,它不是共享的.因为pga是进程指定的,因此它不会在sga中分配. pga是一个内存堆,其中包含了被专用服务器 ...

  4. .Net程序猿乐Android开发---(4)注册页面布局

    接下来我们介绍的登陆页面布局,在本节中,我们看一下注册页面布局,页面布局大同小异,来一起熟悉下基本控件的使用方法. 效果图: 1.加入注冊页面 右键选中layout目录,加入注冊页面.例如以下图 点击 ...

  5. Centos 5.5 更新网卡驱动 bnx2 version: 2.0.2

    操作系统:CentOS release 5.5 (Final) 故障现象:网卡无故自动down掉,使用service  network restart 重启后没多久又会自动down , 连接数大概在2 ...

  6. 手机装linux系统

    第一步: 首先 , 你的手机需要获取root权限. 如果不知道如何获取, 可以到电脑上搜索一下安卓手机root教程. 不同品牌的手机root的方法不同. 也可以到机锋论坛上寻找root的具体方法. 第 ...

  7. poj3259(spfa判负环)

    题目连接:http://poj.org/problem?id=3259 题意:John的农场里N块地,M条路连接两块地,W个虫洞,虫洞是一条单向路,会在你离开之前把你传送到目的地,就是当你过去的时候时 ...

  8. ASP.NET程序发布流程

    1.在要发布的项目上 右键->发布,如下图所示 “目标位置”选择要发布到的本地目录,点击“发布” 2.打开IIS,在右键“网站”,选择“添加网站”,出现如下所示的对话框 在“网站名称”处添加一个 ...

  9. LeetCode——Rotate List

    Given a list, rotate the list to the right by k places, where k is non-negative. For example: Given  ...

  10. Eclipse扩展点实践之添加菜单项(ActionSet方式实现)

    ActionSet方式比起Command方式,比较直观,但是功能有限. 首先:新建一个项目,在Extension中添加org.eclipse.ui.actionSets的扩展. 然后,new-> ...