题意:

给定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. sort如何按指定的列排序·百家电脑学院

    sort如何按指定的列排序·百家电脑学院 sort如何按指定的(9php.com)列排序 0000            27189           41925425065f           ...

  2. TD-SCDMA风雨20年:中国3G标准的由来以及国家通信战略

    .国际电信标准是咋回事? 当年作为通信专业的学生,我曾长期困惑一个问题,为什么同一项通信技术总会有美国和欧洲两种国际标准?比如电话语音的数字化就有欧洲A律和美国u(谬)律两种. 学习后发现,两种标准的 ...

  3. android 自己定义通知栏遇到的问题

    首先看报错信息: E/AndroidRuntime(12220): FATAL EXCEPTION: main E/AndroidRuntime(12220): Process: gn.com.and ...

  4. Android菜鸟的成长笔记(27)——ViewPager的使用

    ViewPager是Android 3.0以上能够使用的API. 一.ViewPager能干什么? 1.微信5.0中连带滑动用ViewPager能够轻松实现. 2.实现相似于新浪微博的导航引导界面. ...

  5. SWT中在treeview中显示图片

    package com.repositoryclient.treeview; import org.eclipse.jface.resource.ImageDescriptor; import org ...

  6. Keepalived+LVS+Nginx负载均衡之高可用

    Keepalived+LVS+Nginx负载均衡之高可用 上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡,若出现Nginx单机故障,则导致整个系统无法正常 ...

  7. c#代码规范和质量检查工具这点事

    c#代码规范和质量检查工具这点事 代码风格检查:StyleCop 代码缺陷检查:FxCop 代码质量: 代码度量值/Code Metrics StyleCop 介绍 The StyleCop tool ...

  8. 再探vim经常使用命令

     最開始学习过vim,见 http://blog.csdn.net/u011848617/article/details/12837873 之后以前不了了之,当再次学习后,发现经常使用命令的掌握还 ...

  9. Radmin远程控制软件

    Radmin远程控制软件 日期:2015-08-20     作者:lujl   Radmin是一款快速的远程控制软件,可以用来远程管理公司或个人计算机来实现远程办公.你可以通过鼠标和键盘来控制远程的 ...

  10. HUNNU11351:Pythagoras's Revenge

    http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11351&courseid=0 Problem des ...