【BZOJ1880】[Sdoi2009]Elaxia的路线(最短路)

题面

BZOJ
洛谷

题解

假装我们知道了任意两点间的最短路,那么我们怎么求解答案呢?
不难发现公共路径一定是一段连续的路径(如果不连续那么显然可以把中间分开的那段变成一样路径)。
这样子我们只需要\(O(n^2)\)枚举这个路径的起点和终点\(check\)一下就可以知道答案了。
然而并没有办法求任意两点之间的最短路,因为这样子是\(O(n^3)\)的。并不要认为对于每个点跑一遍最短路就行了,\(SPFA\)不说了,它死了。\(Dijkstra\)的复杂度是\(O((n+m)logm)\)的,如果\(m=n^2\)还不如\(Floyd\)。
大概的代码如下,我是对于每一个点跑了一遍\(Dij\)(雾

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define MAX 1550
#define pi pair<int,int>
#define mp make_pair
#define fr first
#define sd second
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
struct Line{int v,next,w;}e[MAX*MAX*2];
int h[MAX],cnt=1;
inline void Add(int u,int v,int w){e[cnt]=(Line){v,h[u],w};h[u]=cnt++;}
int dis[MAX][MAX];
int n,m,S1,S2,T1,T2,ans;
bool vis[MAX];
void SPFA(int S,int *dis)
{for(int i=1;i<=n;++i)dis[i]=1e9,vis[i]=false;priority_queue<pi,vector<pi>,greater<pi> > Q;Q.push(mp(0,S));dis[S]=0;while(!Q.empty()){pi u=Q.top();Q.pop();if(vis[u.sd])continue;vis[u.sd]=true;for(int i=h[u.sd];i;i=e[i].next)if(dis[e[i].v]>u.fr+e[i].w){dis[e[i].v]=u.fr+e[i].w;Q.push(mp(dis[e[i].v],e[i].v));}}
}
int Dis1(int i,int j){return dis[S1][i]+dis[i][j]+dis[j][T1];}
int Dis2(int i,int j){return dis[S2][i]+dis[i][j]+dis[j][T2];}
int main()
{n=read();m=read();S1=read(),T1=read(),S2=read(),T2=read();for(int i=1;i<=m;++i){int u=read(),v=read(),w=read();Add(u,v,w);Add(v,u,w);}for(int i=1;i<=n;++i)SPFA(i,dis[i]);for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)if(i!=j){if(Dis1(i,j)>dis[S1][T1]&&Dis1(j,i)>dis[S1][T1])continue;if(Dis2(i,j)>dis[S2][T2]&&Dis2(j,i)>dis[S2][T2])continue;ans=max(ans,dis[i][j]);}printf("%d\n",ans);return 0;
}

首先,对于钦定的起点,我们到达终点一定是沿着最短路径\(DAG\)移动,那么我们考虑对于起点构建最短路径\(DAG\),将几个\(DAG\)重叠之后显然是要求的是\(S1\rightarrow T1\)的一条路径上的最长的、在两个最短路径\(DAG\)中都出现过的链。
那么我们把同时出现在两个\(DAG\)中的边全部拿出来建图,跑一个\(DAG\)上最长链就好了。
我代码写的有点冗长。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define MAX 1550
#define pi pair<int,int>
#define mp make_pair
#define fr first
#define sd second
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
struct Line{int v,next,w;}e[1000000];
int h[MAX],cnt=2,dg[MAX];
inline void Add(int u,int v,int w){e[cnt]=(Line){v,h[u],w};h[u]=cnt++;}
vector<int> E[MAX],W[MAX];
int dis[MAX][MAX];
int n,m,S1,S2,T1,T2,ans;
bool vis[MAX];
void SPFA_heap(int S,int *dis)
{for(int i=1;i<=n;++i)dis[i]=1e9,vis[i]=false;priority_queue<pi,vector<pi>,greater<pi> > Q;Q.push(mp(0,S));dis[S]=0;while(!Q.empty()){pi u=Q.top();Q.pop();if(vis[u.sd])continue;vis[u.sd]=true;for(int i=h[u.sd];i;i=e[i].next)if(dis[e[i].v]>u.fr+e[i].w){dis[e[i].v]=u.fr+e[i].w;Q.push(mp(dis[e[i].v],e[i].v));}}
}
int S[MAX],f[MAX],top;
void Topsort()
{queue<int> Q;for(int i=1;i<=n;++i)if(!dg[i])Q.push(i);while(!Q.empty()){int u=Q.front();Q.pop();S[++top]=u;for(int i=0,l=E[u].size();i<l;++i)if(!--dg[E[u][i]])Q.push(E[u][i]);}for(int i=top;i;--i)for(int j=0,l=E[S[i]].size();j<l;++j)f[S[i]]=max(f[S[i]],f[E[S[i]][j]]+W[S[i]][j]);for(int i=1;i<=top;++i)ans=max(ans,f[S[i]]);
}
int main()
{n=read();m=read();S1=read(),T1=read(),S2=read(),T2=read();for(int i=1;i<=m;++i){int u=read(),v=read(),w=read();Add(u,v,w);Add(v,u,w);}SPFA_heap(S1,dis[S1]);SPFA_heap(T1,dis[T1]);SPFA_heap(S2,dis[S2]);SPFA_heap(T2,dis[T2]);for(int u=1;u<=n;++u)for(int i=h[u];i;i=e[i].next)if(i&1){int u=e[i].v,v=e[i^1].v;if(min(dis[S1][u]+dis[T1][v]+e[i].w,dis[S1][v]+dis[T1][u]+e[i].w)>dis[S1][T1])continue;if(min(dis[S2][u]+dis[T2][v]+e[i].w,dis[S2][v]+dis[T2][u]+e[i].w)>dis[S2][T2])continue;if(dis[S1][u]+dis[T1][v]+e[i].w==dis[S1][T1])E[u].push_back(v),W[u].push_back(e[i].w),dg[v]+=1;else E[v].push_back(u),W[v].push_back(e[i].w),dg[u]+=1;}Topsort();printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/9800218.html

【BZOJ1880】[Sdoi2009]Elaxia的路线(最短路)相关推荐

  1. BZOJ1880:[SDOI2009]Elaxia的路线(最短路,拓扑排序)

    Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...

  2. 【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP

    [BZOJ1880][Sdoi2009]Elaxia的路线 Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起 ...

  3. [BZOJ1880] [Sdoi2009] Elaxia的路线 (SPFA 拓扑排序)

    Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...

  4. BZOJ1880: [Sdoi2009]Elaxia的路线|dijksrtra|暴力

    貌似这题正解是spfa后 什么拓扑排序 其实完全不用酱紫-- 先用dijkstra求出s1 s2 e1 e2 到其他点的单元最短路 的四个数组ds1 ds2 de1 de2 然后枚举所有的 " ...

  5. [SDOI2009]Elaxia的路线

    https://www.luogu.org/problem/show?pid=2149 题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两 ...

  6. P2149-[SDOI2009]Elaxia的路线【最短路】

    正题 题目链接:https://www.luogu.com.cn/problem/P2149 题目大意 nnn个点mmm条边的一张无向图,给定两个起点和对应的终点.求两个最短路的最长公共距离 解题思路 ...

  7. 洛谷2149 Elaxia的路线(dp+最短路)

    QwQ好久没更新博客了,颓废了好久啊,来补一点东西 题目大意 给定两个点对,求两对点间最短路的最长公共路径. 其中\(n,m\le 10^5\) 比较简单吧 就是跑四遍最短路,然后把最短路上的边拿出来 ...

  8. CSP 行车路线 最短路变型

    问题描述: 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加,连续走s ...

  9. Vijos - Car的旅行路线(最短路)

    题目链接:https://vijos.org/p/1119 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两 ...

  10. CCF201712-4 行车路线(最短路)

    试题编号: 201712-4 试题名称: 行车路线 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和 ...

最新文章

  1. 帷幕的帷是什么意思_俗语:“宁娶寡妇,不娶生妻!”什么是“生妻”?老祖宗智慧...
  2. python语言入门u-Python语言十分钟快速入门
  3. Geany整体注释和取消注释快捷键
  4. Java高级面试题!java构造方法的作用和特点
  5. springboot幂等性_请问,springboot项目支付接口设计,如何保证支付的幂等性,并能给前端反馈友好的提示?...
  6. cron 每10分钟执行一次_早餐儿子最爱它,简单卷一卷,10分钟做一大盘,三天两头吃一次...
  7. 介绍一种策略分析师必备的解题技巧
  8. oracle erase,Arc SDE forOracle实现erase空间分析计算
  9. Depth Map Prediction from a Single Image using a Multi-Scale Deep Network
  10. oracle复合索引第一个字段,复合索引的先决使用条件 - stacktestor的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  11. Python爬虫:(亲测,已解决!)解决在使用谷歌浏览器的开发者工具时,没有Referer防盗链缺失问题。
  12. 数据结构 | C语言实现线性表的顺序和链式结构
  13. 如何克服学习过程中的焦虑?
  14. 《卓有成效的管理者》——学习心得(八)
  15. THU-OS rCore学习总结 基于Rust + RISC-V
  16. 云产品相关网络概念学习Regison/AZ/VPC
  17. piwik服务器性能,piwik 大负载以及多域名监控隐藏piwik服务器原始域名解决方案...
  18. java使用工具类生成验证码图片时,出现Exception in thread “main“ java.io.FileNotFoundException: C:\a.jpg (拒绝访问。)
  19. 大学生医用计算机题库,计算机考试题库:计算机考试练习题(74)
  20. 如何计算Yb:YAG薄片激光器的热透镜和激光功率输出

热门文章

  1. FISCO BCOS流量控制实现
  2. 以太坊虚拟机 EVM(4)分布式存储架构设计(FISCO BCOS为例)
  3. DevOps使用教程 华为云(9)代码检查
  4. DevOps使用教程 华为云(5)迭代计划 进度管理
  5. Dell服务器如何重装操作系统 windows server
  6. Hyperledger Fabric教程(5)-- byfn.sh分析-docker-compose-base.yaml
  7. 计算机毕业设计最新选题汇总(持续更新)
  8. 二十五、JAVA多线程(二、吃苹果案例)
  9. 关于SQLyog创建的数据库不显示的问题
  10. Apache Commons Lang3 常用工具类库