正题

题目链接:https://www.luogu.com.cn/problem/P6880


题目大意

给出nnn个点mmm条边的有向图,边有边权和一个翻转权值。

翻转至多一条边使得1−>n−>11->n->11−>n−>1往返的权值加上翻转权值最小。

1≤n≤200,1≤m≤5×1041\leq n\leq 200,1\leq m\leq 5\times 10^41≤n≤200,1≤m≤5×104


解题思路

考虑到nnn很小可以从这个方向入手。

有时翻转会使得最短路变长,这个时候当且仅当这条边是最短路的必经边,而图上最多有n−1n-1n−1条必经边,所以我们如果翻转必经边时直接暴力重新计算一次最短路,否则我们就用预处理的信息来计算。

因为点很少,暴力的dijdijdij比堆优化快

时间复杂度O(n(n2+m))O(n(n^2+m))O(n(n2+m))


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
#define mp(x,y) make_pair(x,y)
using namespace std;
const ll N=210,M=5e4+10;
struct node{ll to,next,w,v,ban;
}a[M<<1];
ll n,m,tot,ls[N],f[N],g[N],F[N],G[N],ff[N],gg[N],from[N],grom[N],ans;
bool v[N];
void addl(ll x,ll y,ll w,ll v,ll ban){a[++tot].to=y;a[tot].next=ls[x];a[tot].v=v;a[tot].ban=ban;ls[x]=tot;a[tot].w=w;return;
}
void dij(ll *f,ll s,ll op=0){memset(v,0,sizeof(v));f[s]=0;for(int i=1;i<=n;i++){int x=0;for(int j=1;j<=n;j++)if(!v[j])x=(f[j]<f[x])?j:x;v[x]=1;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(a[i].ban)continue;if(f[x]+a[i].w<f[y]){f[y]=f[x]+a[i].w;if(op==1)from[y]=i;if(op==2)grom[y]=i;}   }}return;
}
void bij(ll *f,ll s,ll op=0){memset(v,0,sizeof(v));f[s]=0;for(int i=1;i<=n;i++){int x=0;for(int j=1;j<=n;j++)if(!v[j])x=(f[j]<f[x])?j:x;v[x]=1;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(!a[i].ban)continue;if(f[x]+a[i].w<f[y])f[y]=f[x]+a[i].w;}}return;
}
signed main()
{scanf("%lld%lld",&n,&m);tot=1;for(ll i=1;i<=m;i++){ll x,y,c,d;scanf("%lld%lld%lld%lld",&x,&y,&c,&d);addl(x,y,c,d,0);addl(y,x,c,d,1);}memset(f,0x3f,sizeof(f));dij(f,1,1);memset(g,0x3f,sizeof(g));dij(g,n,2);memset(F,0x3f,sizeof(F));bij(F,n);memset(G,0x3f,sizeof(G));bij(G,1);ans=f[n]+g[1];for(ll x=1;x<=n;x++){for(ll i=ls[x];i;i=a[i].next){if(a[i].ban)continue;ll y=a[i].to,w1=f[n],w2=g[1];if(f[x]+a[i].w+F[y]==f[n]&&i==from[y]){a[i].ban=1;a[i^1].ban=0;memset(ff,0x3f,sizeof(ff));dij(ff,1);w1=ff[n];a[i].ban=0;a[i^1].ban=1;}else w1=min(w1,f[y]+a[i].w+F[x]);if(g[x]+a[i].w+G[y]==g[1]&&i==grom[y]){a[i].ban=1;a[i^1].ban=0;memset(gg,0x3f,sizeof(gg));dij(gg,n);w2=gg[1];a[i].ban=0;a[i^1].ban=1;}else w2=min(w2,g[y]+a[i].w+G[x]);ans=min(ans,w1+w2+a[i].v);}}if(ans>=2e18)puts("-1");else printf("%lld\n",ans);return 0;
}

P6880-[JOI 2020 Final]オリンピックバス【最短路】相关推荐

  1. 【题解】LOJ3254:「JOI 2020 Final」集邮比赛 3

    原题传送门 发现 n < = 200 n<=200 n<=200,那么我们就可以想一个 O ( n 3 ) O(n^3) O(n3)的dp 发现每次肯定是向左/右推进 可以令 d p ...

  2. [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分

    题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...

  3. 【JOI 2015 Final】铁路旅行

    铁路旅行 题目描述 JOI 国有 NNN 座城市,依次编号为 1,2,⋯,N1,2,\cdots ,N1,2,⋯,N :还有 N−1N-1N−1 条可双向通行的铁路,依次编号为 1,2,⋯,N−11, ...

  4. 【题解】LOJ2350:「JOI 2018 Final」月票购买

    原题传送门 可以很套路地得到一个结论,答案与月票的路径有一段连续的重复路径 以 s , t , u , v s,t,u,v s,t,u,v为起点跑四次最短路 现在我们枚举两个月票最短路上的点 x , ...

  5. 「JOI 2016 Final」断层

    嘟嘟嘟 今天我们模拟考这题,出的是T3.实在是没想出来,就搞了个20分暴力(还WA了几发). 这题关键在于逆向思维,就是考虑最后的\(n\)的个点刚开始在哪儿,这样就减少了很多需要维护的东西. 这就让 ...

  6. 【最短路】Floyd算法:2020蓝桥最短路

    建图后 跑一遍Floyd #include <iostream> #include<cstring> using namespace std; const int N=200; ...

  7. Luogu P5103 「JOI 2016 Final」断层 树状数组or线段树+脑子

    太神仙了这题... 原来的地面上升,可以倒着操作(时光倒流),转化为地面沉降,最后的答案就是每个点的深度. 下面的1,2操作均定义为向下沉降(与原题意的变换相反): 首先这个题目只会操作前缀和后缀,并 ...

  8. [JOI 2014 Final]裁剪线

    题目 传送门 to LOJ 思路 思路来自于官方题解,有兴趣的 日语高超的 可以自己找来看一看.这里就直接贴出翻译后的截图了 考虑一种并查集的做法,给每一个"区域"分配一个并查集编 ...

  9. T3:LOJ2332「JOI 2017 Final」焚风现象.cpp

    记录差值 然后每次运算一下头和尾 如果尾端是最后一次增加则不用运算尾端 详见代码 #include<iostream> #include<cstdio> #include< ...

最新文章

  1. C语言case次数有限制吗,用switch...case语句统计数字、空格和其他字符出现的次数...
  2. “嫁”给程序媛,走上人生巅峰
  3. Docker容器学习梳理--日常操作总结
  4. 多线程中join()的用法
  5. Cloud for Customer的工作中心(work center)加载器
  6. 如何灵活使用OSS监控数据动态调整OSS服务参数
  7. Py之pandas:dataframe学习【转载】
  8. ENVI相关操作总结(更新中......)
  9. vue中怎么点击修改文字_怎么拍照识别文字?什么软件可以识别照片中文字?
  10. vscode 离线安装.vsix(window 全教程)
  11. 互联网晚报 | 11月18日 星期四 | 看点直播将于11月30日停止服务;B站月活用户达2.67亿;高通宣布进军汽车领域...
  12. matlab整流仿真,基于MATLAB的整流电路的建模与仿真
  13. 判断给到的年份是否为闰年
  14. 网络游戏引入人工智能:游戏玩家并非真人
  15. mysql中在if语句中使用break_if语句中break用法
  16. Fail2Ban 简介与使用
  17. 欢迎大家体验滴滴Logi-KafkaManager
  18. 英国药品信息数据查询(网址)
  19. python-学习笔记-07
  20. C++常用STL库详细总结

热门文章

  1. python 线程 的类库_python类库32[多线程]
  2. idea 配置jdk版本_JDK 11 安装过程(同时已安装了JDK 8)以及Intellij IDEA 配置
  3. python中abc属于字符串吗_在Python中,字符串s = 'abc',那么执行表达式s+'d'之后,s的打印结果是( )。...
  4. 在以下说法错误的是_外行人对翡翠有哪些错误认知?行家给你最精准的答案
  5. c语言 extern_Visual C++ 6.0环境中C语言extern 变量使用过程报错
  6. krc 编辑 linux,Linux网络编程
  7. mysql函数保留小数_MySql自定义函数-关于保留小数位的特殊需求
  8. python 求和并排序_Python算法教程第三章知识点:求和式、递归式、侏儒排序法和并归排序法...
  9. msdn画圆弧函数_画直线不简单!python-matplotlib告诉你为什么
  10. leetcode202. 快乐数