果然我还是太\(Naive\)了

首先有一些点/边其实是没有意义的,如果从1出发不能到该点或者从该点不能到n,这个点就可以不用管了。这个过程可以用正反两边\(dfs/bfs\)实现

然后删掉那些点之后,新图中如果出现了环,那么显然是无解的

然后现在图就转化成了一张\(DAG\)

由于\(1->n\)的所有路径是定值,那么\(1->\)新图中所有点的路径都应该是一个定值(反证一下就知道了)

然后我们发现,对于每一条边\(u->v\),实际上是要满足\(1≤dis_v - dis_u ≤ 9\),不难发现这是一个差分约束模型

移一下项,我们有:\(dis_u+1≤dis_v\),\(dis_v-9≤dis_u\)

于是对于每一条边\((u, v)\),我们连一条\((u, v, 1)\)和一条\((u, v, -9)\)即可

\(Code:\)

不知道为什么只有30,先咕一会,调出来再放

好了调出来了,不连通的那些边的终点起点忘记输出了

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define re register
il int read() {
re int x = 0, f = 1; re char c = getchar();
while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();
return x * f;
}
#define rep(i, s, t) for(re int i = s; i <= t; ++ i)
#define _ 20005
int n, m, head1[_], cnt, head2[_], head3[_], vis[_], dis[_], num[_], pax[_], v1[_], v2[_];
struct edge {
int u, v, w, next;
}e1[_], e2[_], e3[_ << 1];
il void add1(int u, int v) {
e1[++ cnt] = (edge){u, v, 0, head1[u]}, head1[u] = cnt;
e2[cnt] = (edge){v, u, 0, head2[v]}, head2[v] = cnt;
}
il void add2(int u, int v) {
e3[++ cnt] = (edge){u, v, 1, head3[u]}, head3[u] = cnt;
e3[++ cnt] = (edge){v, u, -9, head3[v]}, head3[v] = cnt;
}
il void dfs1(int u) {
v1[u] = 1;
for(re int i = head1[u]; i; i = e1[i].next) if(!v1[e1[i].v]) dfs1(e1[i].v);
}
il void dfs2(int u) {
v2[u] = 1;
for(re int i = head2[u]; i; i = e2[i].next) if(!v2[e2[i].v]) dfs2(e2[i].v);
}
queue<int>q;
il void SPFA() {
memset(dis, -64, sizeof(dis)), q.push(1), dis[1] = 0;
while(!q.empty()) {
int u = q.front(); q.pop(), vis[u] = 0;
for(re int i = head3[u]; i; i = e3[i].next) {
int v = e3[i].v;
if(dis[v] < dis[u] + e3[i].w) {
dis[v] = dis[u] + e3[i].w;
if(!vis[v]) q.push(v), vis[v] = 1, ++ num[v];
if(num[v] > n) puts("-1"), exit(0);
}
}
}
}
int main() {
n = read(), m = read();
rep(i, 1, m) {
int u = read(), v = read();
add1(u, v);
}
dfs1(1), dfs2(n), cnt = 0;
if(!v1[n]) return puts("-1"), 0;
rep(i, 1, n) if(v1[i] && v2[i]) pax[i] = 1;
rep(i, 1, m) if(pax[e1[i].u] && pax[e1[i].v]) add2(e1[i].u, e1[i].v);
SPFA(), printf("%d %d\n", n, m);
rep(i, 1, m) {
if(pax[e1[i].u] && pax[e1[i].v]) {
printf("%d %d %d\n", e1[i].u, e1[i].v, dis[e1[i].v] - dis[e1[i].u]);
}
else printf("%d %d %d\n", e1[i].u, e1[i].v, 9);
}
return 0;
}

P5590 【赛车游戏】的更多相关文章

  1. 使用Unity3D的设计思想实现一个简单的C#赛车游戏场景

    最近看了看一个C#游戏开发的公开课,在该公开课中使用面向对象思想与Unity3D游戏开发思想结合的方式,对一个简单的赛车游戏场景进行了实现.原本在C#中很方便地就可以完成的一个小场景,使用Unity3 ...

  2. Unity赛车游戏之移动

    这个赛车游戏真是让我费劲脑汁啊.尤其是写这种系统化的东西. 目前漂移还没找到更好的算法,不过基本的移动还是可以做到的. 别看就光是个移动,其实也是很费事的. Unity给了个对于赛车系统很好的碰撞组件 ...

  3. 使用Unity3D引擎开发赛车游戏

    Car Tutorial 在Unity3D的Asset Store有一个赛车的Demo —— Car Tutorial,看起来特别酷的赛车游戏Demo,不过我还没有下载下来,因为在公司下载Assets ...

  4. unity3d 赛车游戏——复位点检测优化、反向检测、圈数检测、赛道长度计算

    接着上一篇文章说 因为代码简短且思路简单 所以我就把这几个功能汇总为一篇文章 因为我之前就是做游戏外挂的 经过验证核实,**飞车的复位点检测.圈数检测就是以下的方法实现的 至于反向检测和赛道长度计算, ...

  5. unity3d 赛车游戏——复位点检测

    一直没有时间写博客 昨天我的CarWaypoints插件也告一段落了 今年没回家,过年就我一个人 挺无聊的,那就休息一天写几篇博客吧 我的代码可能很少,但是思路很重要 希望不懂的朋友别只copy代码 ...

  6. [HNOI2011]赛车游戏

    题目描述 名歌手LAALA最近迷上了一款赛车游戏,游戏中开车的玩家在不同的路段需要选择不同的速度,使得自己在最短的时间内到达终点.开始游戏时,车内的初始油量为f,所以游戏的关键是如何在速度和耗油量之间 ...

  7. 一款c语言实现的赛车游戏

    博主学习c语言已经有一段时间了,出于对自己学习检验的目的,自制了一款c语言赛车游戏. 由于本质是检验和尝试,所以并没有注重游戏的界面.下文是开发文档,在博主的github网页可以下载源码,注意本项目使 ...

  8. 【BZOJ2328】 [HNOI2011]赛车游戏

    BZOJ2328 [HNOI2011]赛车游戏 前言 这道题目我真的佛了,卡精度+卡时间这就是下一个聊天鬼才. Solution 首先可以二分出最大速度,然后考虑下坡的话可能有更好的解,然后这样子算一 ...

  9. BZOJ2328: [HNOI2011]赛车游戏

    BZOJ2328: [HNOI2011]赛车游戏 Description 题解Here! 一开始被题面那一长串的描述吓到了,一直没敢做... 然后尝试着硬着头皮读懂题面. 然后...这不是贪心么??? ...

  10. Linux赛车游戏 SuperTuxKart 1.0 正式发布

    SuperTuxKart是一款受Mario Kart(马里奥赛车)启发并以Linux/Tux为主题的开源赛车游戏,经过12年多的开发,已经达到1.0版本.并且确定这个版本确实是一个重要的里程碑. Su ...

随机推荐

  1. 关于PATCH与PUT的区别

    两者的区别:PATCH:更新部分资源,非幂等,非安全PUT:更新整个资源,具有幂等性,非安全注:幂等性:多次请求的结果和请求一次的结果一样安全性:请求不改变资源状态 举个两者明显区别的例子(我对两者定 ...

  2. [LOJ6433] [PKUSC2018] 最大前缀和

    题目链接 LOJ:https://loj.ac/problem/6433 Solution 注意到最大前缀要满足什么性质,假设序列\(a[1..n]\)的最大前缀是\(s_x\),那么显然要满足所有\ ...

  3. AGC028E High Elements 贪心、DP、线段树

    传送门 看到要求"字典序最小"的方案,一个很直观的想法是按位贪心,那么我们需要check的就是当某一个数放在了第一个序列之后是否还存在方案. 假设当前两个序列的最大值和前缀最值数量 ...

  4. Java JDK1.8源码学习之路 1 Object

    写在最前 对于一个合格的后端程序员来说,现行的流行框架早已经能胜任基本的企业开发,Springboot 任何的框架都把重复的工作更佳简单/优化的解决掉,但是完全陷入在这样的温水里面, 好比温水煮青蛙, ...

  5. ADO.NET 八(一个例子)

    可视化方式绑定 DataGridView 控件(写的不详细,结合上一篇) 使用可视化数据绑定方式可以快速完成将数据表中的数据显示在 DataGridView 控件中的操作,并可以很容易地对绑定列的属性 ...

  6. FreeRTOS二值信号量

    API函数 #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) #define xSemaphoreCreateBinary() xQueueGenericCre ...

  7. MMU与cache

    这一快理解的非常浅: MMU 虚拟存储器对内存进行了逻辑上的扩充.比如一个32位的CPU系统,逻辑上的寻址可以达到4GB,但是如果直接对物理地址进行寻址,就要受到主存大小的限制. 在这种条件下,虚拟地 ...

  8. 修改Mysql 字符集,支持Emoji表情

    插入失败 java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1 at ...

  9. [bluez] linux下蓝牙鼠标的延迟问题

    引言 现在的便携设备,接口越来越少了.所以我们没有理由不用蓝牙鼠标.高大上也不贵. 蓝牙4.0之前,蓝牙设备的问题是特别费电.蓝牙4.0之后省电的要命,我的上一个鼠标Microsoft Designe ...

  10. Linux命令——readlink、realpath

    参考:Linux命令——ln Linux readlink and realpath Command Tutorial for Beginners (with Examples) 简介 ln命令允许你 ...