题解: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的情况,显然花费的时间越少高度越高 ...
随机推荐
- Golang 入门 : 整型
整型介绍 Go语言同时提供了有符号和无符号类型的整数运算.这里有 int8.int16.int32 和 int64 四种截然不同大小的有符号整形数类型,分别对应 8.16.32.64 bit大小的有符 ...
- Go map字典排序
前言 我们已经知道 Go 语言的字典是一个无序集合,如果你想要对字典进行排序,可以通过分别为字典的键和值创建切片,然后通过对切片进行排序来实现. 按照键进行排序 如果要对字典按照键进行排序,可以这么做 ...
- nacos(九):sentinel——规则持久化
接上回,sentinel基本使用我们已经掌握.但是在设置限流规则时,会发现规则都是临时的,一段时间没访问资源或者重启sentinel,规则就会消失.所以,我们需要有一个将规则持久化保存的地方,让规则一 ...
- 【Windows】如何关闭Windows10、Windows11自动更新
如何关闭Windows10自动更新 零.问题 Windows10老是自动更新,有时候第二天起来又得重新打开软件,真麻烦,Win10自动更新的时候还有点卡. 如何关闭? 经过上网查询,发现完全关闭难度比 ...
- java学习-6-核心类:字符串StringJoiner 和数组一起玩
public class Main { public static void main(String[] args) { String[] names = {"Bob", &quo ...
- 【AI工具实战】一招解决英文视频困境,四步用AI搞定全中文字幕,你也可以!(文末附工具下载)
"AI时代最大的红利,是让每个人都有机会成为那个"想到就能做到"的创造者." AI粉嫩特攻队,2025年4月5日. 故事源于一个我想看的国外视频.本想点开视频准 ...
- 使用Python可视化莫比乌斯带
引言 莫比乌斯带,这个名字或许大家都听过,但你知道它是什么吗?它是一种非常神奇的几何物体,只有一个面和一个边,乍一看,似乎是个不可思议的存在.今天,我们就来用 Python 轻松地可视化莫比乌斯带,一 ...
- ThinkPHP 集成 Redis 队列:从入门到实战技术分享
一.引言 在分布式系统架构中,异步处理.服务解耦和流量削峰是提升系统性能的核心需求.Redis 作为高性能内存数据库,凭借其丰富的数据结构(如 List.Stream.Sorted Set)和轻量级特 ...
- MIUI系统,APKMirror Installer安装apkm的时候提示app installation failed Installation aborted解决方案
场景 我的手机是MIUI系统,通过APKMirror Installer安装apkm的时候提示app installation failed Installation aborted. 本来不想装了, ...
- windows 隐藏桌面了解此图片
1. 桌面上有了解此图片图标无法删除 这是因为在windows背景设置中选择了Window聚焦. 如果想关闭可以选择其他选项.如果不想关闭Window聚焦还想隐藏桌面了解此图片图标,可以参考下面设置. ...