题目大意:给出出发点和终点和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(负环)的更多相关文章

  1. POJ 3259 Wormholes (判负环)

    Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 46123 Accepted: 17033 Descripti ...

  2. ACM: POJ 3259 Wormholes - SPFA负环判定

     POJ 3259 Wormholes Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu   ...

  3. uva 558 - Wormholes(Bellman Ford判断负环)

    题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...

  4. POJ 3259 Wormholes(最短路,判断有没有负环回路)

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 24249   Accepted: 8652 Descri ...

  5. Poj 3259 Wormholes(spfa判负环)

    Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 42366 Accepted: 15560 传送门 Descr ...

  6. poj 3259 Wormholes【spfa判断负环】

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 36729   Accepted: 13444 Descr ...

  7. POJ 3259 Wormholes( bellmanFord判负环)

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 36425   Accepted: 13320 Descr ...

  8. (简单) POJ 3259 Wormholes,SPFA判断负环。

    Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...

  9. POJ 1151 Wormholes spfa+反向建边+负环判断+链式前向星

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 49962   Accepted: 18421 Descr ...

随机推荐

  1. Swift - CALayer的contents属性动画

    Swift - CALayer的contents属性动画 效果 源码 https://github.com/YouXianMing/Swift-Animations // // LiveImageVi ...

  2. MySQL查询字符串长度最长的记录

    select `字段`, length(`字段`) from 表名 where length(`字段`) = ( select max(length(`字段`)) from 表名  )http://s ...

  3. 灵书妙探第一季/全集Castle迅雷下载

    第一季 Castle Season 1 (2009)看点:ABC电视台2009年开播的一部罪案剧,讲述一位罪案小说家Richard Castle帮助纽约警察局凶杀组破案的故事.凶案组女警探Kate B ...

  4. android应用推荐

    脱单宝典: http://file.bmob.cn/M00/D5/1E/oYYBAFR27BOAPu1JACq_bnF_6-E971.apk

  5. Java并发编程的艺术(六)——线程间的通信

    多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同. 1. volatile.synchronized关键字 PS:关于volatile的详细介绍请移步至:Java ...

  6. 《Excel效率手册:早做完,不加班》

    <Excel效率手册:早做完,不加班> 基本信息 作者: 陈锡卢    杨明辉 出版社:清华大学出版社 ISBN:9787302350743 上架时间:2014-5-8 出版日期:2014 ...

  7. [转]使用PHPExcel判别和格式化Excel中的日期格式

    From : http://renzhen.iteye.com/blog/799391 最近,在做一个导入功能,在系统中使用PHPExcel类库,读取上传的Excel文件,然后进行字段映射,最后将Ex ...

  8. 算法生成N芒星

    前面两个图像生成算法是:道教的太极八卦图和佛教的卐和卍字图.这一节整个洋气的图像:芒星.但愿我别召唤出什么恐怖的禁忌,尤其今晚还是万圣节之夜.平时看玄幻小说,经常读到有关六芒星,七芒星,九芒星的技法. ...

  9. 数学图形之贝塞尔(Bézier)曲面

    前面章节中讲了贝塞尔(Bézier)曲线,而贝塞尔曲面是对其多一个维度的扩展.其公式依然是曲线的公式: . 而之所以由曲线变成曲面,是将顶点横向连了再纵向连. 很多计算机图形学的教程都会有贝塞尔曲面的 ...

  10. Android开发者选项 介绍

    15个必知的Android开发者选项 https://www.jianshu.com/p/07b551ee260b  1.Stay awake 充电时保持屏幕唤醒,开发的时候,时不时的锁屏真是够了,开 ...