最近打的一场校内训练的某题原题。。。

题目如下:

Description

公元22××年,宇宙中最普遍的交通工具是spaceship。spaceship的出现使得星系之间的联系变得更为紧密,所以spaceship船长也成了最热门的职业之一。当然,要成为一名出色的船长,必须通过严格的考核,例如下面是最简单的问题中的一个。
用1~n的整数给n个星系标号,目前你在标号为1的星系,你需要送快递到标号为n的星系,星系之间由于存在陨石带,并不是都可以直连的。同时,由于超时空隧道的存在,在某些星系间飞行会出现时间静止甚至倒流,飞行时间为0或为负数。另外,由星系i到星系j的时间和由星系j到星系i的时间不一定是相同的。
在寄出日期之前收到快递被认为是不允许的,所以每部spaceship上都有一个速度调节装置,可以调节飞行的时间。简单来说其功能就是让所有两个星系间的飞行时间(如果可以直达)都增加或减少相同的整数值,你的任务就是调整速度调节器,找出一条用最短时间完成任务的路径,并且保证这个最短时间的值大于或等于0。

INPUT

输入文件包含多组数据,第1个数为T,表示数据的数量。
对于每一组数据,输入第1行为两个正整数N(≤N≤),E(≤E≤N*(N-)/),为星系的个数和星系间飞行的路线数。然后E行,每行三个整数i,j和t(≤i,j≤N,i≠j,-≤t≤),表示由星系i到星系j飞行的时间为t。由i到j最多只会有一条飞行线路。

OUTPUT

输出文件共T行,每组数据输出一行;
如果可以通过调节速度调节器完成任务,则输出一个非负整数,表示由星系1到星系N的最短时间。
如果不能由星系1到达星系N,则输出-。

SAMPLEINPUT


  -

SAMPLEOUTPUT


HINT

样例说明

输入样例如图所示,其中节点标号表示相应星系,节点间数字表示所需时间。

如果设置速度控制器的值为0,则有如下路径:→→→→→……→→,使得投递的时间为负无穷大,显然是不符合要求的,所以应该把速度控制器的值设为1,相当于每个时间值加1,得到的最短路径为1→→→,所需时间为2+(-)+=。

--------------以下是题解-----------------------------

题意简析:题目就是给你一张有向图,你可以对图中所有边的边权加上或者减去一个整数,使得从1~n的最短路在非负的前提下最小。

解题思路:首先用floyd判断是否有解,然后二分答案用SPFAcheck是否有负环并求解,注意解的合法性即可。

附代码:

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<cmath>
#define For(i,a,b) for (int i=a; i<=b; i++)
#define Ford(i,a,b) for (int i=a; i>=b; i--)
#define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
#define mem(qaq,num) memset(qaq,num,sizeof(qaq));
#define ll long long
#define mod 1000000007
#define INF 2000000000
using namespace std;
struct edge{
int to,next,v;
}e[];
int head[];
int rep[];
int dist[];
bool mrk[];
int go[][];
int q[];
int T,n,m,l,r,cnt,ans;
inline int in(){
int x=,f=;
char ch=getchar();
while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x*f;
} inline void ins(int u,int v,int w)
{
e[++cnt].to=v;
e[cnt].v=w;
e[cnt].next=head[u];
head[u]=cnt;
}
inline int check(int lim)
{
For(i,,n)mrk[i]=;
For(i,,n)dist[i]=INF;
For(i,,n)rep[i]=;
memset(q,,sizeof(q));
q[]=;mrk[]=;dist[]=;rep[]=;
int t=,w=;
while (t<w)
{
int now=q[++t];
mrk[now]=;
for (int i=head[now];i;i=e[i].next)
{
if (dist[e[i].to]>dist[now]+e[i].v+lim&&go[e[i].to][n])
{
dist[e[i].to]=dist[now]+e[i].v+lim; if (!mrk[e[i].to]&&rep[e[i].to]<=n)
{
mrk[e[i].to]=;
rep[e[i].to]++;
if (rep[e[i].to]>n)return -;
q[++w]=e[i].to;
}
}
}
}
return dist[n];
}
inline void doit()
{
mem(e,);
mem(head,);
mem(go,);
cnt=;
n=in(),m=in();
int mn=INF;
int mx=-INF;
For(i,,m)
{
int x,y,z;
x=in(),y=in(),z=in();
ins(x,y,z);
mn=min(mn,z);
mx=max(mx,z);
go[x][y]=;
}
For(i,,n)go[i][i]=;
For(k,,n)
For(i,,n)
For(j,,n)
go[i][j]=go[i][j]|(go[i][k]&go[k][j]);
if (!go[][n]){printf("-1\n");return;}
l=-mx;r=-mn;
ans=-;
while (l<=r)
{
int mid=(l+r)>>,now=check(mid);
if (now>=&&now!=INF){ans=now;r=mid-;}
else l=mid+;
}
printf("%d\n",ans);
}
int main()
{
T=in();
while (T--)doit();
}

本文由Melacau编写,Melacau代表M星向您问好,如果您不是在我的博客http://www.cnblogs.com/Melacau上看到本文,请您向我联系,email:13960948839@163.com.

【GDOI】【图论-最短路】时间与空间之旅的更多相关文章

  1. NOIP模拟赛-时间与空间之旅

    题目描述 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spaceship船长也成了最热门的职业之一.当然,要成为一名出色的船 ...

  2. C/C++用匿名数据结构实现时间和空间名利双收

    程序的时间和空间,往往是一对矛盾,比如计算CRC32的时候会用到余式表 DWORD *crcTable; // DWORD[256]; 余式表可以用某种规则计算生成,为缩短文章长度就不写出来了,总之要 ...

  3. 测试Protobuffer的定义格式对其时间和空间的影响

    测试Protobuffer格式的A命令转换为std::string的的字节个数,分别测试了工程中用到的几种命令: a)AddLayer:108 b)AddSource:209 c)MoveLayer: ...

  4. java性能时间与空间消耗

    Java性能时间与空间消耗 一.减少时间消耗 标准代码优化 (1) 将循环不变量的计算移出循环 例如:for (int i=0; i<size()*2; i++) { ... } ------& ...

  5. protobuf中会严重影响时间和空间损耗的地方

    http://blog.chinaunix.net/uid-26922071-id-3723751.html 当前项目中普遍用到GOOGLE 的一个开源大作PROTOBUF,把它作为网络应用层面的传输 ...

  6. 88、展示Tensorflow计算图上每个节点的基本信息以及运行时消耗的时间和空间

    ''' Created on May 24, 2017 @author: p0079482 ''' #使用程序输出日志 import tensorflow as tf with tf.Session( ...

  7. HashSet扩容机制在时间和空间上的浪费,远大于你的想象

    一:背景 1. 讲故事 自从这个纯内存项目进了大客户之后,搞得我现在对内存和CPU特别敏感,跑一点数据内存几个G的上下,特别没有安全感,总想用windbg抓几个dump看看到底是哪一块导致的,是我的代 ...

  8. 【月光宝盒get√】用时间置换空间,聊聊稀疏数组的那些事儿

    背景 数据结构是指带有结构特性的数据元素的集合.在数据结构中,数据之间通过一定的组织结构关联在一起,便于计算机存储和使用.从大类划分,数据结构可以分为线性结构和非线性结构,适用于不同的应用场景. 线性 ...

  9. HDU 5521 [图论][最短路][建图灵感]

    /* 思前想后 还是决定坚持写博客吧... 题意: n个点,m个集合.每个集合里边的点是联通的且任意两点之间有一条dis[i]的边(每个集合一个dis[i]) 求同时从第1个点和第n个点出发的两个人相 ...

随机推荐

  1. 基于Python的Web应用开发实践总结

    基于Python的Web应用开发学习总结 项目地址   本次学习采用的是Flask框架.根据教程开发个人博客系统.博客界面如图所示. 整个学习过程收获很多,以下是学习总结. 1.virtualenv ...

  2. 2017-2018-1 我爱学Java 第二周 作业

    Android Game Discussion Questions Answers 20162309邢天岳 20162311张之睿 20162312张家铖 20162313苑洪铭 20162324春旺 ...

  3. Tornado 用户身份验证框架

    1.安全cookie机制 import tornado.web session_id = 1 class MainHandler(tornado.web.RequestHandler): def ge ...

  4. IOS webview iframe 宽度超出屏幕解决方案

    IOS 真机webview中,iframe 却不能很好地适应屏幕大小,总是超出屏幕尺寸,需要左右滚动才能看到完整页面. <div style="overflow: auto;-webk ...

  5. android 时间获取以及时间格式化

    Android中获取系统时间有多种方法,可分为Java中Calendar类获取,java.util.date类实现,还有android中Time实现 现总结如下: 方法一: void getTime1 ...

  6. faster-rcnn 结构杂谈

    faster-rcnn结构图: (只截取了最难理解的部分) 这个网络看似很复杂,但是理解了其中关键的层,就基本可以掌握这个结构了.要看源码!!要看源码!!要看源码 !!重要的事情说三遍. 关键的层: ...

  7. 同样是IT培训,为什么人家月薪过万,你才几千,问题在哪?!

    听过一句话"360行,行行转IT",虽然有些夸张,但也不难看出IT行业的火爆程度.从李总理提的"互联网+大数据"开始,中国的这场"互联网+" ...

  8. velocity学习总结

    什么是velocity velocity是一个基于Java的模板引擎,它可以实现彻底的前后端,前端不允许像jsp那样出现Java代码,而是利用context容器传递变量,在java代码里面我们可以往容 ...

  9. 用js 获取url 参数 页面跳转 ? 后的参数

    记得之前在原来的公司写过这个东西,但是还是忘记怎么接住参数了,只知道怎么把id传过去! 问了身边的大佬 他首先推荐了我一个链接是别人写好的方法 附上链接地址:http://blog.csdn.net/ ...

  10. 服务器Windows Server 2008 远程控制安全设置技巧

    为了保障服务器远程控制操作的安全性,Windows Server 2008系统特意在这方面进行了强化,新推出了许多安全防范功能,不过有的功能在默认状态下并没有启用,这需要我们自行动手,对该系统进行合适 ...