题解:P6880 [JOI 2020 Final] オリンピックバス
一个比较重要的性质:反转的边要在最短路上才会有贡献。
我们可以先跑一遍最短路,记录下整颗最短路树,然后暴力的对每一条边进行判断,反转。
我们建正反图各两个,分别以 \(1\),\(n\) 为起点。\(n\),\(1\) 为终点。然后对每个图跑最短路,记录下最短路树。
若不反转任何一条边,则答案为 \(1\) 到 \(n\) 再到 \(1\) 的最短路。
然后暴力枚举边,第 \(i\) 条边,考虑将其反转。反转之后 \(1\) 到 \(n\) 的最短路即为 \(1\) 到 \(V_i\) 再从 \(U_i\) 走到 \(n\) 的最短路。往返分开来算。
有一个需要注意的点是,不可以开全局 long long 进行运算,否则只有5 分。
讲的比较少,都在代码里。
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+7;
const int M=207;
int n,m;
int u[N],v[N];
long long c[N],d[N],ans;
struct node{
int frnt;
long long sum1[M],sum2[M];
bool fl[M],st[N];
int lst[N];
struct Map{
int to,val,nxt,hed;
}G[N];
int cnt=0;
void add(int u,int v,int w){
G[++cnt].to=v;
G[cnt].val=w;
G[cnt].nxt=G[u].hed;
G[u].hed=cnt;
}
void DJ(){
memset(fl,0,sizeof fl);
for(int i=1;i<=n+1;i++) sum1[i]=1e9;
sum1[frnt]=0;
for(int i=1;i<=n;i++){
int u=n+1;
for(int j=1;j<=n;j++) if(!fl[j]&&sum1[j]<sum1[u]) u=j;
if(u==n+1) break;
fl[u]=1;
for(int j=G[u].hed;j;j=G[j].nxt){
int v=G[j].to,w=G[j].val;
if(!fl[v]&&sum1[v]>sum1[u]+w){
sum1[v]=sum1[u]+w;
lst[v]=j;//给在最短路树上的点打标记。
}
}
}
for(int i=1;i<=n;i++) if(i!=frnt) st[lst[i]]=1;//这里是计录下最短路树。
}
int swp;
void DJ2(){
memset(fl,0,sizeof fl);
for(int i=1;i<=n+1;i++) sum2[i]=1e9;
sum2[frnt]=0;
for(int i=1;i<=n;i++){
int u=n+1;
for(int j=1;j<=n;j++) if(!fl[j]&&sum2[j]<sum2[u]) u=j;
if(u==n+1) break;
fl[u]=1;
for(int j=G[u].hed;j;j=G[j].nxt){
int v=G[j].to,w=G[j].val;
if(!fl[v]&&sum2[v]>sum2[u]+w&&j!=swp){//这里多了一个判断:即不能为翻转之前的边。
sum2[v]=sum2[u]+w;
}
}
}
}
long long work(int u,int end){
if(!st[u]) return sum1[end];//不在最短路树上
swp=u;
DJ2();
return sum2[end];
}
}g[5];
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
g[1].frnt=g[4].frnt=1,g[2].frnt=g[3].frnt=n;
for(int i=1;i<=m;i++){
cin>>u[i]>>v[i]>>c[i]>>d[i];
g[1].add(u[i],v[i],c[i]);//四个图
g[2].add(v[i],u[i],c[i]);
g[3].add(u[i],v[i],c[i]);
g[4].add(v[i],u[i],c[i]);
}
for(int i=1;i<=4;i++) g[i].DJ();//不反转,求最短路
ans=g[1].sum1[n]+g[3].sum1[1];//初始答案
for(int i=1;i<=m;i++){//将边反转
int go=min(g[1].work(i,n),g[1].work(i,v[i])+c[i]+g[2].work(i,u[i]));//去
int back=min(g[3].work(i,1),g[3].work(i,v[i])+c[i]+g[4].work(i,u[i]));//来
ans=min(ans,go+back+d[i]);
}
if(ans>=1e9) ans=-1;
cout<<ans;
return 0;
}
题解:P6880 [JOI 2020 Final] オリンピックバス的更多相关文章
- JOI 2020 Final 题解
T1. 只不过是长的领带 大水题,把 \(a_i,b_i\) 从小到大排序. 发现最优方案只可能是大的 \(a_i\) 跟大的 \(b_i\) 匹配,小的 \(a_i\) 与小的 \(b_i\) 匹配 ...
- 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)
[题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...
- JOI 2018 Final 题解
题目列表:https://loj.ac/problems/search?keyword=JOI+2018+Final T1 寒冬暖炉 贪心 暴力考虑每相邻两个人之间的间隔,从小到大选取即可 #incl ...
- 「JOI 2017 Final」JOIOI 王国
「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...
- 「JOI 2015 Final」分蛋糕 2
「JOI 2015 Final」分蛋糕 2 题解 这道题让我想起了新年趣事之红包这道DP题,这道题和那道题推出来之后的做法是一样的. 我们可以定义dp[i][len][1] 表示从第i块逆时针数len ...
- [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分
题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...
- LOJ#2351. 「JOI 2018 Final」毒蛇越狱
LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...
- JOI 2019 Final合集
JOI 2019 Final 合集 #3010. 「JOI 2019 Final」勇者比太郎 其实如果读懂题了就是水题了 题目就是让你求满足条件的\(JOI\),使得\(O\)在\(J\)同行的 ...
- 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)
LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...
- 「JOI 2014 Final」飞天鼠
「JOI 2014 Final」飞天鼠 显然向上爬是没有必要的,除非会下降到地面以下,才提高到刚好为0. 到达一个点有两种情况:到达高度为0和不为0. 对于高度不为0的情况,显然花费的时间越少高度越高 ...
随机推荐
- Qt 获取本机ipv4地址
Qt 获取本机本地网卡的IPv4地址 本文介绍怎么用Qt去获取本机的ipv4地址 文章目录 Qt 获取本机本地网卡的IPv4地址 用法 用法 话不多说,直接上代码: QHostAddress host ...
- go ceph s3文件管理
导入依赖 go get gopkg.in/amz.v1/aws go get gopkg.in/amz.v1/s3 创建用户 在初始化连接之前,我们需要创建一个用户得到accessKey和secret ...
- linux ssh 免密登录
1.服务器端开启密钥登录模式 $ vim /etc/ssh/sshd_config # 是否允许 root 远程登录 PermitRootLogin yes # 密码登录是否打开 PasswordAu ...
- SLAM建图导航信息(仿真)
博客地址:https://www.cnblogs.com/zylyehuo/ 基于[基于机器人自主移动实现SLAM建图],详见之前的博客 基于机器人自主移动实现SLAM建图 - zylyehuo - ...
- 记录一个命令 可以在linux很方便的安装一些软件
小鱼的一键安装系列 wget http://fishros.com/install -O fishros && . fishros 一键安装:ROS(支持ROS和ROS2,树莓派Jet ...
- DVWA靶场实战(十三)——CSP Bypass
DVWA靶场实战(十三) 十三.CSP Bypass: 1.漏洞原理: CSP Bypass全称是Content-Security-Policy,中文叫做绕过内容安全策略.Content-Securi ...
- 【Java】Math类的基本操作
Math类 Math 类是数学操作类,提供了一系列的数学操作方法,包括求绝对值.三角函数等,在 Math 类中提供的一切方法都是静态方法(类方法),所以直接由类名称调用即可. Math类的基本操作: ...
- 【单片机】滑稽AT89C52表情实现
[单片机]滑稽AT89C52表情实现 零.原因 在群里看到了这样一个表情: 这是用51做的,刚好开发板上有8个小灯,想实现一下. 一.代码 新建工程,写入如下代码: #include<reg52 ...
- Web前端入门第 30 问:CSS 文本与字体样式常用属性
CSS 盒模型是基石,文本和字体则是盒子内容的重要组成部分.毕竟清水房有了,软装也得跟上啊. 字体常用属性 font-family 定义字体类型(如: Arial, "Microsoft Y ...
- luaL_ref如何使用
// main.lua中有个全局函数function gf() print("hello world")end// c++中处理void callgf(){ lua_getglob ...