HDU 4848 - Wow! Such Conquering!
Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
With the ambition of conquering
other spaces, he would like to visit all Doge Planets as soon as possible. More
specifically, he would like to visit the Doge Planet x at the time no later than
Deadlinex. He also wants the sum of all arrival time of each Doge
Planet to be as small as possible. You can assume it takes so little time to
inspect his Doge Army that we can ignore it.
EOF.
Each test case contains several lines. The first line of each test case
contains one integer: n, as mentioned above, the number of Doge Planets. Then
follow n lines, each contains n integers, where the y-th integer in the x-th
line is Txy . Then follows a single line containing n - 1 integers:
Deadline2 to Deadlinen.
All numbers are guaranteed to
be non-negative integers smaller than or equal to one million. n is guaranteed
to be no less than 3 and no more than 30.
“-1” (which means the Super Doge will say “WOW! So Slow! Such delay! Much Anger!
. . . ” , but you do not need to output it), else output the minimum sum of all
arrival time to each Doge Planet.
Explanation:
In case #1: The Super Doge travels to Doge Planet 2 at the time of 8 and to Doge Planet 3 at the time of 12,
then to Doge Planet 4 at the time of 16.
The minimum sum of all arrival time is 36.
首先Floyd算法得到任意两点间的最短时间;
然后之间进行DFS,剪枝优化时间。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 33
#define INF 0x3f3f3f3f
using namespace std;
int d[MAXN][MAXN],ans;
int n,deadline[MAXN],arrival_time[MAXN];
bool vis[MAXN];
void floyd()
{
for(int k=;k<=n;k++)
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++) d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
}
void dfs(int now,int cur_time,int sum_time,int cnt)
{
if(cnt==n)//走完了n个星球
{
ans=min(ans,sum_time);//尝试更新答案,使得答案是到目前为止的最优解
return;
} if(sum_time + cur_time * (n-cnt) >= ans) return;
//最优性剪枝:当前到达时间和 + 当前时间 * 还没去的星球 >= 到目前为止的最优解,剪掉
// 因为,到目前为止,还没去的星球,到达那里的时间必然大于等于当前时间 for(int i=;i<=n;i++) if(!vis[i] && cur_time>deadline[i]) return;
//可行性剪枝:到目前为止,现在的时间大于未到达的星球的deadline,已经不满足要求,剪掉 for(int next=;next<=n;next++)
{
if(now!=next && !vis[next] && cur_time+d[now][next]<=deadline[next])
{
vis[next]=;
dfs(next,cur_time+d[now][next],sum_time+cur_time+d[now][next],cnt+);
vis[next]=;
}
} }
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
scanf("%d",&d[i][j]);
} for(int i=;i<=n;i++) scanf("%d",&deadline[i]);
deadline[]=INF; floyd(); ans=INF;
vis[]=;
dfs(,,,);
printf("%d\n", ((ans==INF)?-:ans) );
}
}
HDU 4848 - Wow! Such Conquering!的更多相关文章
- hdu 4848 Wow! Such Conquering! (floyd dfs)
Wow! Such Conquering! Problem Description There are n Doge Planets in the Doge Space. The conqueror ...
- HDU-4848 Wow! Such Conquering! 爆搜+剪枝
Wow! Such Conquering! 题意:一个n*n的数字格,Txy表示x到y的时间.最后一行n-1个数字代表分别到2-n的最晚时间,自己在1号点,求到达这些点的时间和的最少值,如果没有满足情 ...
- hdu 4850 Wow! Such String! 欧拉回路
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4080264.html 题目链接:hdu 4850 Wow! Such String! 欧拉回 ...
- hdu 4893 Wow! Such Sequence!(线段树)
题目链接:hdu 4983 Wow! Such Sequence! 题目大意:就是三种操作 1 k d, 改动k的为值添加d 2 l r, 查询l到r的区间和 3 l r. 间l到r区间上的所以数变成 ...
- HDU 4850 Wow! Such String!(欧拉道路)
HDU 4850 Wow! Such String! 题目链接 题意:求50W内的字符串.要求长度大于等于4的子串,仅仅出现一次 思路:须要推理.考虑4个字母的字符串,一共同拥有26^4种,这些由这些 ...
- HDU 4849 Wow! Such City!陕西邀请赛C(最短路)
HDU 4849 Wow! Such City! 题目链接 题意:依照题目中的公式构造出临接矩阵后.求出1到2 - n最短路%M的最小值 思路:就依据题目中方法构造矩阵,然后写一个dijkstra,利 ...
- HDU 4848
http://acm.hdu.edu.cn/showproblem.php?pid=4848 题意:求遍历所有点的最小值(这个答案是加i点到起始点的距离,不是当前点到i的距离),必须在ti[i]前到达 ...
- HDU 4893 Wow! Such Sequence! (线段树)
Wow! Such Sequence! 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4893 Description Recently, Doge ...
- hdu 4848 搜索+剪枝 2014西安邀请赛
http://acm.hdu.edu.cn/showproblem.php?pid=4848 比赛的时候我甚至没看这道题,事实上不难.... 可是说实话,如今对题意还是理解不太好...... 犯的错误 ...
随机推荐
- 九个PHP很有用的功能
1. 函数的任意数目的参数 你可能知道PHP允许你定义一个默认参数的函数.但你可能并不知道PHP还允许你定义一个完全任意的参数的函数 下面是一个示例向你展示了默认参数的函数: // 两个默认参数的函数 ...
- C++ mysql 乱码
C++读mysql数据库中的中文显示出来的是乱码 在连接到数据库后加上这么一句 mysql_query(pMYSQL, "SET NAMES GB2312"); 或者 mysql_ ...
- MySQL实现树状所有子节点查询的方法
本文实例讲述了MySQL实现树状所有子节点查询的方法.分享给大家供大家参考,具体如下: 在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方 ...
- 你必须知道的10个提高Canvas性能技巧
你还在抱怨自己写的canvas demo徘徊在10帧以下吗?你还在烦恼打开自己写的应用就听见CUP风扇转吗?你正在写一个javascript Canvas库吗?那么下面九点就是你必须知道的! 一.预渲 ...
- Onpaint和OnDraw的区别
(一) OnPaint 和 OnDraw (1)OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中. (2)OnP ...
- 微信公众号access_token的获取与存储
如果是一个用户触发,那么只要将access_token放在数据库,文件,nosql就行,取时判断时间是否过期,过期重新去微信获取再放入. 如果是很多用户,多进程并发,特别是分布式那种架构呢?进程A判断 ...
- Spring系列之访问数据库
一.概述 Spring的数据访问层是以统一的数据访问异常层体系为核心,结合JDBC API的最佳实践和统一集成各种ORM方案,完成Java平台的数据访问. 二.JDBC API的最佳实践 Spring ...
- Android井字游戏(二)游戏界面
图片与代码可见书配套官网下载 1 棋盘 1.1 先将游戏界面所需的图片放于“drawable-xxhdpi”文件夹中,后缀xxhdpi表示超高密度. 然后将图片封装到drawable中一个名为til ...
- 【jquery基础】 jquery.manifest用法:通过后台查询and添加到默认项
今天做一个东西 效果如下: 后台已经保存了006这个SN码,现在需要查到了这个人(杨小婷),然后作为默认值,展示到 manifest 里面 <script> $(document).rea ...
- Android NDK学习(2)Windows下NDK开发环境配置
转:http://www.cnblogs.com/fww330666557/archive/2012/12/14/2817386.html 一.配置好Android开发环境 二.下载安装安卓NDK ...