HDU 4284 Travel
据说是TSP经典问题。。。可以用状态压缩做。但是看到数据量,就厚着脸皮上搜索了。。。先floyd预处理每对点间的最小消费,然后只考虑要去的城市就可以了,这样的话城市数最多16个。。。当时就暴搜了。。。但是注意城市1如果也需要工作的话不一定是第一个工作的城市。。。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
#include<cmath> #define INF 0X3f3f3f3f
#define LL long long
#define PB(a) push_back(a);
#define CLR(a, b) memset(a, b, sizeof(a)) using namespace std; const int N = 222;
const int H = 33; struct City
{
int num, c, d;
}ct[H]; int g[N][N], m[H][H], h, n, mk;
bool vis[H]; void floyd()
{
int i, j, k;
for(k = 1; k <= n; k ++)
{
for(i = 1; i <= n; i ++)
{
for(j = 1; j <= n; j ++)
{
g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
}
}
}
} bool dfs(int u, int my)
{
int i, j, f = 1;
for(i = 0; i < h; i ++) if(!vis[i])
{
f = 0;
if(my - m[u][i] >= ct[i].d)
{
vis[i] = 1;
if(dfs(i, my - m[u][i] - ct[i].d + ct[i].c)) return 1;
vis[i] = 0;
}
}
if(f && my < m[u][mk]) f = 0;
return f;
} int main()
{
int t, i, j, u, v, w, my, r;
scanf("%d", &t);
while(t --)
{
scanf("%d%d%d", &n, &r, &my);
CLR(g, INF);
for(i = 1; i <= n; i ++)
{
g[i][i] = 0;
}
for(i = 0; i < r; i ++)
{
scanf("%d%d%d", &u, &v, &w);
g[u][v] = min(g[u][v], w);
g[v][u] = g[u][v];
}
scanf("%d", &h);
mk = -1;
for(i = 0; i < h; i ++)
{
scanf("%d%d%d", &ct[i].num, &ct[i].c, &ct[i].d);
if(ct[i].num == 1)
{
mk = i;
}
}
if(mk == -1)
{
mk = h;
ct[h].num = 1;
ct[h].c = 0;
ct[h].d = 0;
h ++;
}
floyd();
for(i = 0; i < h; i ++)
{
for(j = 0; j < h; j ++)
{
m[i][j] = g[ct[i].num][ct[j].num];
}
}
CLR(vis, 0);
if(dfs(mk, my)) puts("YES");
else puts("NO");
}
}
HDU 4284 Travel的更多相关文章
- 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 (Folyd预处理+dfs暴搜)
题意:给你一些N个点,M条边,走每条边要花费金钱,然后给出其中必须访问的点,在这些点可以打工,但是需要先拿到证书,只可以打一次,也可以选择不打工之直接经过它.一个人从1号点出发,给出初始金钱,问你能不 ...
- hdu 4284 Travel(floyd + TSP)
虽然题中有n<=100个点,但实际上你必须走过的点只有H<=15个.而且经过任意点但不消耗C[i]跟D[i]可以为无限次,所以可以floyd预处理出H个点的最短路,之后剩下的...就成了裸 ...
- hdu 5380 Travel with candy(双端队列)
pid=5380">题目链接:hdu 5380 Travel with candy 保持油箱一直处于满的状态,维护一个队列,记录当前C的油量中分别能够以多少价格退货,以及能够推货的量. ...
- Travel(HDU 4284状压dp)
题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走, ...
- hdu 5441 Travel 离线带权并查集
Travel Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5441 De ...
- hdu 4284 状态压缩
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4284 #include<cstdio> #include<cstring> # ...
- hdu 2433 Travel
http://acm.hdu.edu.cn/showproblem.php?pid=2433 题意: 求删除任意一条边后,任意两点对的最短路之和 以每个点为根节点求一个最短路树, 只需要记录哪些边在最 ...
随机推荐
- Windows的TCP协议参数
注册表编辑器:regedit 表项:HKEY_LOCAL_MACHINE\SYSTEM\CurentControlSet\Services\Tcpip\Parameters 窗口扩大因子 & ...
- PCB设计资料:看到最后才知道是福利
參考资料 通过以下的关键词直接从网络上Google或Baidu就能非常easy的找到以下的资料,这里仅仅是以參考文献的方式做一个整理以及简单的说明. 刘雅芳,张俊辉. 抗干扰角度分析六层板的布线技巧. ...
- android内存的一点优化
android手机给应用分配的内存通常是8兆左右,如果处理内存处理不当很容易造成OutOfMemoryError,我们的产品出现最多的错误也是OutOfMemoryError的异常, 在解决这个异常时 ...
- Random Teams
n participants of the competition were split into m teams in some manner so that each team has at le ...
- Hough变换在opencv中的应用
霍夫曼变换(Hough Transform)的原理 霍夫曼变换是一种可以检测出某种特殊形状的算法,OpenCV中用霍夫曼变换来检测出图像中的直线.椭圆和其他几何图形.由它改进的算法,可以用来检测任何形 ...
- VC Office2007界面对话框实现
我们知道VS2008SP1之后,MFC就多了一个功能包,可以快速的建立一个ribbon的界面,视觉样式可以在office 2007蓝.黑等颜色之间切换,这对于单文档/多文档做界面非常方便,而且也蛮好看 ...
- Eclipse相关集锦第二季
Eclipse相关的问题第二季开始了,这些问题都是我平时遇到的,然后记录下来备忘,帮助到别人最好不过了. 1.Unable to execute dex: GC overhead limit exce ...
- Android Content Provider的启动过程源码分析
本文參考Android应用程序组件Content Provider的启动过程源码分析http://blog.csdn.net/luoshengyang/article/details/6963418和 ...
- Linux下SSH Session复制
羡慕Windows下secureCRT的Session Copy功能,一直在寻找Linux下类似的软件,殊不知SSH本身就支持此功能. 特别感谢阿干同学的邮件分享. 详细方法 ? 1 2 3 4 Li ...
- Python 学习入门(21)—— 线程
本文介绍了Python对于线程的支持,包括“学会”多线程编程需要掌握的基础以及Python两个线程标准库的完整介绍及使用示例. 1. 线程基础 1.1. 线程状态 线程有5种状态,状态转换的过程如下图 ...