正题

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


题目大意

给出\(n\)个点\(m\)条边的有向图,边有边权和一个翻转权值。

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

\(1\leq n\leq 200,1\leq m\leq 5\times 10^4\)


解题思路

考虑到\(n\)很小可以从这个方向入手。

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

因为点很少,暴力的\(dij\)比堆优化快

时间复杂度\(O(n(n^2+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. JOI 2020 Final 题解

    T1. 只不过是长的领带 大水题,把 \(a_i,b_i\) 从小到大排序. 发现最优方案只可能是大的 \(a_i\) 跟大的 \(b_i\) 匹配,小的 \(a_i\) 与小的 \(b_i\) 匹配 ...

  2. 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)

    [题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...

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

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

  4. JOI 2018 Final 题解

    题目列表:https://loj.ac/problems/search?keyword=JOI+2018+Final T1 寒冬暖炉 贪心 暴力考虑每相邻两个人之间的间隔,从小到大选取即可 #incl ...

  5. LOJ#2351. 「JOI 2018 Final」毒蛇越狱

    LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...

  6. 「JOI 2017 Final」JOIOI 王国

    「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...

  7. JOI 2019 Final合集

    JOI 2019 Final 合集 #3010. 「JOI 2019 Final」勇者比太郎 其实如果读懂题了就是水题了 题目就是让你求满足条件的\(JOI​\),使得\(O​\)在\(J​\)同行的 ...

  8. 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)

    LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...

  9. 「JOI 2014 Final」飞天鼠

    「JOI 2014 Final」飞天鼠 显然向上爬是没有必要的,除非会下降到地面以下,才提高到刚好为0. 到达一个点有两种情况:到达高度为0和不为0. 对于高度不为0的情况,显然花费的时间越少高度越高 ...

  10. 「JOI 2015 Final」城墙

    「JOI 2015 Final」城墙 复杂度默认\(m=n\) 暴力 对于点\((i,j)\),记录\(ld[i][j]=min(向下延伸的长度,向右延伸的长度)\),\(rd[i][j]=min(向 ...

随机推荐

  1. wpf 富文本编辑器richtextbox的简单用法

    最近弄得一个小软件,需要用到富文本编辑器,richtextbox,一开始以为是和文本框一样的用法,但是实践起来碰壁之后才知道并不简单. richtextbox 类似于Word,是一个可编辑的控件.结构 ...

  2. WPF日积月累之DataGrid样式以及操作数据模板中的控件

    一.效果图 二.代码预览 1 <Window x:Class="Test.MainWindow" 2 xmlns="http://schemas.microsoft ...

  3. 天地图API加载ArcGIS Server服务

    发布的服务需要选择WMS功能 wmsLayer = new T.TileLayer.WMS("http://127.0.0.1:6080/arcgis/services/Demo/Defau ...

  4. Jmeter HTML 报告、Jenkins 配置

    目录 Jmeter 生成 HTML 测试报告 Jenkins 配置 Jmeter 生成 HTML 测试报告 JMeter 支持生成 HTML 测试报告, 以便从测试计划中获得图表和统计信息. 以上定义 ...

  5. BUUCTF-[网鼎杯 2020 青龙组]AreUSerialz

    BUUCTF-[网鼎杯 2020 青龙组]AreUSerialz 看题 <?php include("flag.php"); highlight_file(__FILE__) ...

  6. MySQL——字符串类型——char(n) 和 varchar(n)

    MySQL 的 char(n) 和 varchar(n) 括号中 n 代表字符的个数,而非字节个数,这里说的字符不论文字种类,假设一个字段的数据类型被规定为 char(2),则可以在这个字段上插入 ' ...

  7. 使用 IDEA 配合 Dockerfile 部署 SpringBoot 工程

    准备 SpringBoot 工程 新建 SpringBoot 项目,默认的端口是 8080 ,新建 Controller 和 Mapping @RestController public class ...

  8. JVM双亲委派模型及其优点

    JVM双亲委派模型及其优点 什么是双亲委派模型? 双亲委派模型: ​ 如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器, ...

  9. Python - 面向对象编程 - __call__()

    __call()__ 的作用 使得类实例对象可以像普通函数那样被调用 实际栗子 from typing import Callable class PoloBlog: def __init__(sel ...

  10. 不使用注解和使用注解的web-service-dao结构

    一.未使用注解的web-service-dao结构 1.action类源码 其中,service作为一个成员属性,采用的是层层调用,service类中dao作为一个成员属性,再成员方法中调用: 2.b ...