2014.10.28模拟赛【时间与空间之旅】

Porble 1时间与空间之旅(tstrip.*)

题目描述

公元22××年,宇宙中最普遍的交通工具是spaceship。spaceship的出现使得星系之间的联系变得更为紧密,所以spaceship船长也成了最热门的职业之一。当然,要成为一名出色的船长,必须通过严格的考核,例如下面是最简单的问题中的一个。

用1~n的整数给n个星系标号,目前你在标号为1的星系,你需要送快递到标号为n的星系,星系之间由于存在陨石带,并不是都可以直连的。同时,由于超时空隧道的存在,在某些星系间飞行会出现时间静止甚至倒流,飞行时间为0或为负数。另外,由星系i到星系j的时间和由星系j到星系i的时间不一定是相同的。

在寄出日期之前收到快递被认为是不允许的,所以每部spaceship上都有一个速度调节装置,可以调节飞行的时间。简单来说其功能就是让所有两个星系间的飞行时间(如果可以直达)都增加或减少相同的整数值,你的任务就是调整速度调节器,找出一条用最短时间完成任务的路径,并且保证这个最短时间的值大于或等于0。

输入格式

输入文件包含多组数据,第1个数为T,表示数据的数量。

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

输出格式

输出文件共T行,每组数据输出一行;

如果可以通过调节速度调节器完成任务,则输出一个非负整数,表示由星系1到星系N的最短时间。

如果不能由星系1到达星系N,则输出-1。

输入样例

1

4 5

1 2 1

1 3 1

2 3 -3

3 1 1

3 4 1

输出样例

2

样例说明

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

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

我说把广东省选题拿来考NOIP真的好吗

题意是要把所有的边加上或者减去一个值,使得最短路没有负环,输出最小非负解

要二分加上去的数字。这个没问题

然后要判断在最短路的路径上没有负环。不仅是判断负环的问题,还要求在最短路的路径上

因此在spfa判负环的基础上做这样的处理:

首先floyd预处理出各个点之间的连通性。我们只更新可以到达目标点的状态

即当当前这个点可以到达n点的时候才更新

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<cstdlib>
  5 #include<algorithm>
  6 #include<cmath>
  7 #include<queue>
  8 #include<deque>
  9 #include<set>
 10 #include<map>
 11 #include<ctime>
 12 #define LL long long
 13 #define inf 598460606
 14 #define pa pair<int,int>
 15 #define pi 3.1415926535897932384626433832795028841971
 16 #define mod 100007
 17 using namespace std;
 18 struct edge{
 19     int to,next,v;
 20 }e[1000010];
 21 int head[100010];
 22 int rep[100010];
 23 int dist[100010];
 24 bool mrk[100010];
 25 int go[110][110];
 26 int q[mod];
 27 int T,n,m,l,r,cnt,ans;
 28 inline void ins(int u,int v,int w)
 29 {
 30     e[++cnt].to=v;
 31     e[cnt].v=w;
 32     e[cnt].next=head[u];
 33     head[u]=cnt;
 34 }
 35 inline int jud(int lim)
 36 {
 37     for (int i=1;i<=n;i++)mrk[i]=0;
 38     for (int i=1;i<=n;i++)dist[i]=inf;
 39     for (int i=1;i<=n;i++)rep[i]=0;
 40     memset(q,0,sizeof(q));
 41     q[1]=1;mrk[1]=1;dist[1]=0;rep[1]=1;
 42     int t=0,w=1;
 43     while (t<w)
 44     {
 45         int now=q[++t];
 46         mrk[now]=0;
 47         for (int i=head[now];i;i=e[i].next)
 48         {
 49           if (dist[e[i].to]>dist[now]+e[i].v+lim&&go[e[i].to][n])
 50           {
 51             dist[e[i].to]=dist[now]+e[i].v+lim;
 52
 53             if (!mrk[e[i].to]&&rep[e[i].to]<=n)
 54             {
 55                 mrk[e[i].to]=1;
 56                 rep[e[i].to]++;
 57                 if (rep[e[i].to]>n)return -1;
 58                 q[++w]=e[i].to;
 59             }
 60           }
 61       }
 62     }
 63     return dist[n];
 64 }
 65 inline void work()
 66 {
 67     memset(e,0,sizeof(e));
 68     memset(head,0,sizeof(head));
 69     memset(go,0,sizeof(go));
 70     cnt=0;
 71     scanf("%d%d",&n,&m);
 72     int mn=inf;
 73     int mx=-inf;
 74     for (int i=1;i<=m;i++)
 75     {
 76       int x,y,z;
 77       scanf("%d%d%d",&x,&y,&z);
 78       ins(x,y,z);
 79       mn=min(mn,z);
 80       mx=max(mx,z);
 81       go[x][y]=1;
 82     }
 83     for(int i=1;i<=n;i++)go[i][i]=1;
 84     for(int k=1;k<=n;k++)
 85       for(int i=1;i<=n;i++)
 86         for(int j=1;j<=n;j++)
 87           go[i][j]=go[i][j]|(go[i][k]&go[k][j]);
 88     if (!go[1][n]){printf("-1\n");return;}
 89     l=-mx;r=-mn;
 90     ans=-1;
 91     while (l<=r)
 92     {
 93         int mid=(l+r)>>1,now=jud(mid);
 94         if (now>=0&&now!=inf){ans=now;r=mid-1;}
 95         else l=mid+1;
 96     }
 97     printf("%d\n",ans);
 98 }
 99 int main()
100 {
101     freopen("tstrip.in","r",stdin);
102     freopen("tstrip.out","w",stdout);
103     scanf("%d",&T);
104     while (T--)work();
105 }

tstrip

时间: 2024-09-30 15:15:41

2014.10.28模拟赛【时间与空间之旅】的相关文章

10.2模拟赛总结

10.2 模拟赛总结 T1. 数位dp: 一个非常非常非常非常显然的数位 DP \([L,R] = [1,R]-[1,L-1]\) 所以是分别求两次小于等于某个数字的方案数 \(f(i,j,k)\) 表示从低位数起的第 \(i\) 位,按照规则计算后答案为 \(j\quad (j=0,1)\) \(k\) 表示只考虑后面结尾和 \(lmt\)后面几位 的大小关系 \((k=0,1)\) 考虑第 \(i+1\) 位,算一下新构成的数字并判断下大小就可以了 注意到 \(L,R\) 数据范围特别大,需

10.22 模拟赛

10.22 模拟赛 T1 染色 考虑每个连通块删成一棵树就好了. mmp场上就我路径压缩写炸.... #include<iostream> #define MAXN 200006 using namespace std; int n , m; int fa[MAXN] , siz[MAXN] , book[MAXN] , sz[MAXN]; int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); } int main() {

10.31 模拟赛

10.31 模拟赛 A LIS 考虑每个数字前从 $ m $ 降序构造到 $ a_i $ 即可. #include <iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<vector> using namespace std; #define MAXN 300006 int n , m , k; int A[MAXN]; vector<int&g

10.5模拟赛

这么多模拟赛都没整理,能整理一天算一天吧qaq T1题面 sol:应该不难吧,分别对横坐标和纵坐标取差的绝对值,易知:如果互质就可以看到,否则就不行.然后出题人很毒瘤要用unsigned long long. #include <cstdio> #include <algorithm> using namespace std; long long x1,y1,x2,y2,c1=0,c2=0; unsigned long long x,y; unsigned long long AB

10 01模拟赛订正

好吧,这是我第一次写模拟赛的订正,主要是有时间而且这次的题确实好... 第一题确实好,用的算法人人都会,就是看你能不能想到,我考只打了O(n^4)的暴力,最后还苦逼的MLE,爆零了... 暴力就不多说了...枚举两个点更新其他的点... 其实我考场上思考的是,能被标记的点都与其他的点有什么联系,可惜,除了模拟题目的做法,就不会了... 那让我们就认真地思考一发:我们设A(x1,x2),B(x2,c2),C(x3,c3)来更新D点,只有:有两个点横坐标相等,有两个点纵坐标相等,才可以更新出来一个新

2019.10.24模拟赛赛后总结

本文原创,如果有不到位的地方欢迎通过右下角的按钮私信我! A.Icow Player 题目描述 被无止境的农活压榨得筋疲力尽后,Farmer John打算用他在MP3播放器市场新买的iCow来听些音乐,放松一下.FJ的iCow里存了N(1 <= N <= 1,000)首曲子,按1..N依次编号.至于曲子播放的顺序,则是按一个Farmer John自己设计的算法来决定: * 第i首曲子有一个初始权值R_i(1 <= R_i <= 10,000). * 当一首曲子播放完毕,接下来播放的

17.2.10 NOIP模拟赛 聪哥的工资

聪哥的工资 (money/money.in/money.out) 时限1000ms 内存256MB 题目描述 lwher: 了体验劳苦大众的生活,聪哥在暑假参加了打零工的活动,这个活动分为n个工作日,每个工作日的工资为Vi.有m个结算工钱的时间,聪哥可以自由安排这些时间,也就是说什么时候拿钱,老板说的不算,聪哥才有发言权! (因为聪哥是土豪,他是老板的老板,你觉得老板敢给聪哥安排任务吗?所以聪哥的工作就是看心情去拿钱拿完就走人啦...) 聪哥不喜欢身上一次性有太多的钱,于是他想安排一下拿钱的时间

10.1 模拟赛

由于算错了inf 又ak失败了 过于菜 T1 年轮蛋糕 loj 2758 题目大意: n个数构成的环 把这个环分成三段 使最小的最大 求这个最小段的和的最大值 思路: 可以想到二分 因为log方可以过 所以可以二分长度后lower_bound找断点 或者使用滑动窗口 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cma

10.27 模拟赛

这一次终极被吊打 甚至没进前十 T2 最后改错 T3 没写正解 T1 elim 题目大意: n 行 m 列的游戏棋盘,一行或一列上有连续 三个或更多的相同颜色的棋子时,这些棋子都被消除 当有多处可以被消除时,这些地方的棋子将同时被消除 求消除后的棋盘 思路: sb模拟 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cm