UVALive - 4618 Wormholes(负环)
题目大意:给出出发点和终点和m个虫洞(虫洞的出发点。终点,生成时间和花费时间)。问从起点到终点花费的最小时间
解题思路:关键是有负环,所以直接跑最短路算法的话会TLE。所以负环要处理一下
可是这个负环又不是负环。由于负环到一定程度的话。就会消失。
比方。到达时间小于虫洞的生成时间,那么负环就消失了。也就是说,负环内的点满足的最优情况就是到达时间刚好等于生成时间
所以,先找出负环,接着推断一下这个负环内的能节省的最多时间。然后将全部点都减去那个时间,那么负环就消失了
详细看代码
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 110
#define INF 0x3f3f3f3f
struct Point{
int x, y, z;
}s1, s2;
struct wormhole{
Point s, t;
int start, cost;
}W[N];
int n, source, sink;
int dis[N][N];
int distance(int i, int j) {
int x = W[i].t.x - W[j].s.x;
int y = W[i].t.y - W[j].s.y;
int z = W[i].t.z - W[j].s.z;
return ceil(sqrt(1.0 * x * x + 1.0 * y * y + 1.0 * z * z));
}
void init() {
scanf("%d%d%d%d%d%d%d", &s1.x, &s1.y, &s1.z, &s2.x, &s2.y, &s2.z, &n);
source = 0;
sink = n + 1;
W[0].s = s1;
W[0].t = s1;
W[0].start = -INF;
W[0].cost = 0;
W[sink].s = s2;
W[sink].t = s2;
W[sink].start =-INF;
W[sink].cost = 0;
for (int i = 1; i <= n; i++)
scanf("%d%d%d%d%d%d%d%d", &W[i].s.x, &W[i].s.y, &W[i].s.z, &W[i].t.x, &W[i].t.y, &W[i].t.z, &W[i].start, &W[i].cost);
//dis[i][j]表示从第i个虫洞的终点走到第j个虫洞的出发点的时间
for (int i = 0; i <= sink; i++)
for (int j = 0; j <= sink; j++)
dis[i][j] = distance(i, j);
}
int pre[N], d[N];
void solve() {
for (int i = 0; i <= sink; i++) {
d[i] = INF;
pre[i] = -1;
}
d[source] = 0;
while (1) {
int tmp;
bool flag = false;
//找最短路
for (int i = 0; i <= sink; i++)
for (int j = 0; j <= sink; j++) {
tmp = max(d[i] + dis[i][j], W[j].start) + W[j].cost;
if (tmp < d[j]) {
d[j] = tmp;
pre[j] = i;
flag = true;
}
}
//不用更新了
if (!flag) {
printf("%d\n", d[sink]);
return ;
}
for (int i = 0; i <= sink; i++) {
int k = i;
//推断有没有环
for (int j = 0; j <= sink && k != -1; j++) k = pre[k];
if (k == -1) continue;
//找出更新的值,破除这个负环,更新的值就是到达起点的值和生成时间的差的最小值。由于在负环内能够等待到生成时间
int Min = d[pre[k]] + dis[pre[k]][k] - W[k].start;
for (int j = pre[k]; j != k; j = pre[j])
Min = min(d[pre[j]] + dis[pre[j]][j] - W[j].start, Min);
//假设不存在负环了
if (Min <= 0) continue;
//更新负环内的点的距离,破解负环
d[k] -= Min;
for (int j = pre[k]; j != k; j = pre[j])
d[j] -= Min;
}
}
}
int main() {
int test;
scanf("%d", &test);
while (test--) {
init();
solve();
}
return 0;
}
UVALive - 4618 Wormholes(负环)的更多相关文章
- POJ 3259 Wormholes (判负环)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 46123 Accepted: 17033 Descripti ...
- ACM: POJ 3259 Wormholes - SPFA负环判定
POJ 3259 Wormholes Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu ...
- uva 558 - Wormholes(Bellman Ford判断负环)
题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...
- POJ 3259 Wormholes(最短路,判断有没有负环回路)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 24249 Accepted: 8652 Descri ...
- Poj 3259 Wormholes(spfa判负环)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 42366 Accepted: 15560 传送门 Descr ...
- poj 3259 Wormholes【spfa判断负环】
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 36729 Accepted: 13444 Descr ...
- POJ 3259 Wormholes( bellmanFord判负环)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 36425 Accepted: 13320 Descr ...
- (简单) POJ 3259 Wormholes,SPFA判断负环。
Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...
- POJ 1151 Wormholes spfa+反向建边+负环判断+链式前向星
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 49962 Accepted: 18421 Descr ...
随机推荐
- Java POI 3.17写入、导入EXCEL性能测试
我们先测试一下写入 50000 条 程序源码: 写入的excel文件信息 再看一下文件的结构 我们再次测试一下导入数据库的性能(用移动的网络上传至电信服务器): 在导入的过程中也可以中止导入行为: 上 ...
- 采用redis 主从架构的原因
如果系统的QPS超过10W+,甚至是百万以上的访问,则光是Redis是不够的,但是Redis是整个大型缓存架构中,支撑高并发的架构非常重要的环节. 首先,你的缓存中间件.缓存系统,必须能够支撑起10w ...
- JAVA设计模式-设计原则
6大原则: 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则 开闭原则 一.单一职责原则 定义:应该有且仅有一个原因引起类的变更 带来的好处: 类的复杂性降低,实现什么职责有清晰明确 ...
- C#与Java 的区别
相同点:都是面向对象编程的语言,都能够实现面向对象的(封装,继承,多态)思想 不同点:1. c#中的命名空间是namespace类似于Java中的package(包),在Java中导入包用impo ...
- 利用Microsoft.Exchange.WebServices处理Office365邮件的几个属性
使用Microsoft.Exchange.WebServices可以很方便操作Office365邮件.这里列出几个重要的属性. 通常,代码里会先定义一个WebServices对象 ExchangeSe ...
- WebFormViewEngine及用户控件寻址bug
在做我的网站的时候遇到了主题切换的问题,特总结与大家共享. 熟悉asp.net mvc的朋友都知道,mvc中,默认情况下视图都在views文件夹下放着.要想改变文件必须重写WebFormViewEng ...
- Tomcat6和Tomcat7配置SSL通信的比较
<Tomcat6和Tomcat7配置SSL通信的比较> 作者:chszs,转载需注明.博客主页: http://blog.csdn.net/chszs 在项目开发过程中,尝尝会遇到Tomc ...
- 【总结】关于MediaPlayer中的getCurrentPosition()和seekTo(int)的总结
在使用音频时,需要用到MediaPlayer,除了一些基础的方法之外,比较难掌握的就是设计播放点的调转的地方,进过反复调试,我最终找到一个可以让getCurrentPosition()和seekTo( ...
- 读书笔记,《深入理解java虚拟机》,第三章 垃圾收集器与内存分配策略
要实现虚拟机,其实人们主要考虑完成三件事情: 第一,哪些内存需要回收: 第二,什么时候回收: 第三,如何回收. 第二节,对象已死吗 垃圾收集其实主要是针对java堆里面的数据来说的,传统的垃圾收 ...
- js el jstl list 循环
需要在js中获取从Controller传过来的list集合,通过循环遍历找到对应的值,赋值到指定input框中 刚开始做法: for (var h = 0; h < gradesize; h++ ...