hdu 4284 Travel(floyd + TSP)
虽然题中有n<=100个点,但实际上你必须走过的点只有H<=15个。而且经过任意点但不消耗C[i]跟D[i]可以为无限次,所以可以floyd预处理出H个点的最短路,之后剩下的。。。就成了裸的TSP了,dp[sta][i]表示已经遍历过了sta集合中的点,现在在i点所需的最少花费。dp[i][j]=-1表示该点不可到达。。但是在最后统计最小解的时候要特判。。。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<fstream>
#include<sstream>
#include<bitset>
#include<vector>
#include<string>
#include<cstdio>
#include<cmath>
#include<stack>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define FF(i, a, b) for(int i=a; i<b; i++)
#define FD(i, a, b) for(int i=a; i>=b; i--)
#define REP(i, n) for(int i=0; i<n; i++)
#define CLR(a, b) memset(a, b, sizeof(a))
#define debug puts("**debug**")
#define LL long long
#define PB push_back
#define MP make_pair
#define eps 1e-10
using namespace std; const int maxn = 105;
const int INF = 1e9;
int n, m, H, V, T;
int go[20], C[20], D[20], g[maxn][maxn], dp[1<<15][20]; void floyd()
{
FF(i, 1, n+1)
{
FF(j, 1, n+1) g[i][j] = INF;
g[i][i] = 0;
}
int u, v, w;
while(m--)
{
scanf("%d%d%d", &u, &v, &w);
if(g[u][v] > w) g[u][v] = g[v][u] = w;
}
FF(k, 1, n+1) FF(i, 1, n+1) FF(j, 1, n+1) g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
} int main()
{
scanf("%d", &T);
while(T--)
{
scanf("%d%d%d", &n, &m, &V);
floyd(); scanf("%d", &H);
REP(i, H) scanf("%d%d%d", &go[i], &C[i], &D[i]); int tot = (1<<H) - 1;
CLR(dp, -1);
REP(i, H) if(V - g[1][go[i]] >= D[i]) dp[1<<i][i] = g[1][go[i]] - C[i] + D[i]; FF(i, 1, tot+1) REP(j, H) if(dp[i][j] != -1) //dp[i][j]可到达
{
REP(k, H) if((i&(1<<k)) == 0) //k点未到达
{
int sta = i|(1<<k);
if(V - dp[i][j] - g[go[j]][go[k]] >= D[k])
{
if(dp[sta][k] == -1) dp[sta][k] = dp[i][j] + g[go[j]][go[k]] - C[k] + D[k];
else dp[sta][k] = min(dp[sta][k], dp[i][j] + g[go[j]][go[k]] - C[k] + D[k]);
}
}
}
int ans = INF;
//特判dp[tot][i]可到达,最开始忘了。。。10+wa
REP(i, H) if(dp[tot][i] != -1) ans = min(ans, dp[tot][i] + g[go[i]][1]);
printf("%s\n", ans <= V ? "YES" : "NO");
}
return 0;
}
hdu 4284 Travel(floyd + TSP)的更多相关文章
- hdu 4284 Travel(壮压DP&TSP&floyd)
Travel Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- 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 4284 Travel
据说是TSP经典问题...可以用状态压缩做.但是看到数据量,就厚着脸皮上搜索了...先floyd预处理每对点间的最小消费,然后只考虑要去的城市就可以了,这样的话城市数最多16个...当时就暴搜了... ...
- HDU 4284 Travel (Folyd预处理+dfs暴搜)
题意:给你一些N个点,M条边,走每条边要花费金钱,然后给出其中必须访问的点,在这些点可以打工,但是需要先拿到证书,只可以打一次,也可以选择不打工之直接经过它.一个人从1号点出发,给出初始金钱,问你能不 ...
- hdu 5380 Travel with candy(双端队列)
pid=5380">题目链接:hdu 5380 Travel with candy 保持油箱一直处于满的状态,维护一个队列,记录当前C的油量中分别能够以多少价格退货,以及能够推货的量. ...
- Travel(HDU 4284状压dp)
题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走, ...
- hdu 4284(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4284 思路:类似于poj3311:http://poj.org/problem?id=3311,首先f ...
- hdu 1596(Floyd 变形)
http://acm.hdu.edu.cn/showproblem.php?pid=1596 find the safest road Time Limit: 10000/5000 MS (Java/ ...
- hdu 1217 (Floyd变形)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217 Arbitrage Time Limit: 2000/1000 MS (Java/Others) ...
随机推荐
- 配置Jenkins的slave节点的详细步骤适合windows等其他平台(转)
@ 新建一个slave节点在Jenkins服务器上 1,进入Jenkins的主界面,进入“Manage Jenkins” 页面: 2,点击如下图中的“Manage Nodes”: 3,进入页面后点 ...
- 修改 Mac 默认 PHP 运行环境,给 MAMP 配置全局 Composer
在没有配置全局性的 Composer 的时候,如果你在没有安装 Composer 的目录下运行 Composer 命令,比如:create-project 系统会返回: Could not open ...
- c语言统计字符数(判断a-z哪个字符出现次数最多)
http://poj.grids.cn/practice/2742 描述判断一个由a-z这26个字符组成的字符串中哪个字符出现的次数最多输入第1行是测试数据的组数n,每组测试数据占1行,是一个由a-z ...
- C++辛格尔顿
设计模式是编程的焦点.经常在面试时进行审查,Singleton模式是最简单的.最常见的.大部分的主模式.所以大部分的采访是测试考试的Singleton设计模式. 以下我们就来看看单例模式怎样实现(C+ ...
- ASP.NET - 锚点跳转,用于回到顶部
<a name ="top"></a> <a href ="#top">回到顶部</a> 第一行代码写在顶部,第 ...
- Eclipse用法和技巧十五:自动添加未实现方法1
java代码中经常要实现一些接口,这个也是java代码独有的地方.实现接口,就意味着要实现这个接口中定义的方法,如果一个个去码出方法就需要记得方法名称等等,就算有内容辅助快捷键帮助,也是很麻烦的.这里 ...
- linux下C/C++IDE比较——Code::Blocks
工欲善其事,必先利其器.用了这么久的linux,现在比较主流的几个C/C++的IDE基本已都用过了,现在来对他们做一下简单的比较. 1.VIM首先要说的是VIM.我认为,VIM只是一个编辑器,不能算是 ...
- oracle如何设置show parameter显示隐含参数
在sqlplus中shwo parameter是显示不了隐藏参数的,需要做一个处理,如下所示: 以SYS用户登录: C:\Documents and Settings\guogang>sq ...
- [置顶] 无名管道的C++封装
xpipe-无名管道的C++封装类 无名管道的C++封装类,用于父子进程进行通信 基础介绍 unix下一切皆文件,管道也不例外.无名管道pipe定义在<unistd.h>中. #inclu ...
- EasyUI - Draggable 拖动控件
效果: html代码: <div id="box" style="width: 400px; height: 200px; background-color: #f ...