HDU 4284 状压dp+spfa

时间:2021-11-15 06:39:55

题意:

给定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&lpar;状压dp&rpar;

    题目链接: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&lpar;状压dp)

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

  6. hdu 2167&lpar;状压dp&rpar;

    题目链接: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 软件补丁问题&lpar;状压DP&comma;SPFA&rpar;

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

  9. hdu 3254 &lpar;状压DP&rpar; Corn Fields

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

随机推荐

  1. 百度echarts地图扩展动态加载geoCoord

    var data={}; for(var i=0;i<result.length;i++){ data[(""+result[i].name+"")]=e ...

  2. Struts2 用 s&colon;if test 判断String类型的对象属性值和单字符是否相等的问题

    Struts2 用 s:if test 判断String类型的对象属性值和单字符是否相等的问题   首先,这里所指的单字符形如:Y,男. 有两种做法: a. <s:if test='news.s ...

  3. Linux 链接(转载)

    来源:http://www.cnblogs.com/sonic4x/archive/2011/08/05/2128543.html 1.Linux链接概念Linux链接分两种,一种被称为硬链接(Har ...

  4. shell 中数学计算总结

    shell中的赋值和操作默认都是字符串处理,在此记下shell中进行数学运算的几个特殊方法,以后用到的时候可以来看,呵呵.   1.错误方法举例   a)   var=1+1   echo $var  ...

  5. Swift项目兼容Objective-C问题汇总

    Swift项目兼容Objective-C问题汇总 转载自 http://www.cocoachina.com/swift/20150608/12025.html 本文是投稿文章,作者:一叶(博客)欢迎 ...

  6. linux c&sol;c&plus;&plus; GDB教程详解(转)

    http://www.gnu.org/manual/ http://www.gnu.org/software/gdb/documentation/ http://sourceware.org/gdb/ ...

  7. Android dump &period;so 文件crash log

    众所周知,在android系统上,有时候我们遇到so文件的crash仅仅能打log,可是非常多时候并不知道crash在什么地方,幸运的是crash后,一般能够产生一个.dmp文件. 我们能够依据这个文 ...

  8. 以交互方式使用exp&sol;imp的演示

    众所周知,用exp/imp对数据库进行逻辑备份.包含表.用户,整个数据库,我们通常所熟悉的是使用命令行指定參数的方式来做的.以下我来演示一下不太经常使用的以交互方式的操作,操作非常easy.就是仅仅要 ...

  9. HTML知识点记录

    1.input的type设置为file时,设置multiple属性可以同时选择多个文件.

  10. SQL Server将自己的查询结果作为待查询数据子列之一

    嵌套子查询是SQL语句中比较常用的一种查询方法,开发过程中遇到查询需要将自己的某列作为待查询的数据,在参考别人的SQL语句的写法终于实现了自己需要的功能. 查询语句如下: SELECT DISTINC ...