Solution

另外$ m <=5e5$。

两条最短路的 最长公共路径 一定是若干条连续的边, 并且满足拓扑序。

于是我们分别 正向 和反向走第二条路径,若该条边同时是两条最短路径上的边, 则加入边集。

最后拓扑 求最长链即可

Code

 #include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#define rd read()
using namespace std; const int N = ;
const int inf = 1e9; int head[N], tot, vis[N];
int Head[N], Tot;
int dis[][N], f[N];
int n, m, s1, s2, t1, t2; queue<int> q; struct edge {
int nxt, to, w;
}e[N * N], E[N * N]; int read() {
int X = , p = ; char c = getchar();
for (; c > '' || c < ''; c = getchar())
if (c == '-') p = -;
for (; c >= '' && c <= ''; c = getchar())
X = X * + c - '';
return X * p; } void add(int u, int v, int w) {
e[++tot].to = v;
e[tot].nxt = head[u];
e[tot].w = w;
head[u] = tot;
} void Add(int u, int v, int w) {
E[++Tot].to = v;
E[Tot].nxt = Head[u];
E[Tot].w = w;
Head[u] = Tot;
} int jud(int x, int i) {
if (dis[][x] + e[i].w + dis[][e[i].to] != dis[][t1])
return ;
return dis[][x] + e[i].w + dis[][e[i].to] == dis[][t2];
} void spfa(int S, int *b) {
for (int i = ; i <= n; ++i)
b[i] = inf;
q.push(S);
b[S] = ;
for (int u; !q.empty(); ) {
u = q.front(); q.pop();
vis[u] = ;
for (int i = head[u]; i; i = e[i].nxt) {
int nt = e[i].to;
if (b[nt] <= b[u] + e[i].w)
continue;
b[nt] = b[u] + e[i].w;
if (!vis[nt])
vis[nt] = , q.push(nt);
}
}
} void bfs() {
for (int u = ; u <= n; ++u)
for (int i = head[u]; i; i = e[i].nxt)
if (jud(u, i)) Add(u, e[i].to, e[i].w);
} int dp(int u) {
if (f[u] != -)
return f[u];
int tmp = ;
for (int i = Head[u]; i; i = E[i].nxt) {
int nt = E[i].to;
tmp = max(dp(nt) + E[i].w, tmp);
}
return f[u] = tmp;
} int main()
{
n = rd; m = rd;
s1 = rd; t1 = rd; s2 = rd; t2 = rd;
for (int i = ; i <= m; ++i) {
int u = rd, v = rd, w = rd;
add(u, v, w); add(v, u, w);
}
spfa(s1, dis[]); spfa(t1, dis[]); spfa(s2, dis[]); spfa(t2, dis[]);
bfs(); int ans = ;
memset(f, -, sizeof(f));
for (int i = ; i <= n; ++i)
ans = max(ans, dp(i)); memset(f, -, sizeof(f));
memset(Head, , sizeof(Head));
Tot = ;
swap(s2, t2);
spfa(s2, dis[]); spfa(t2, dis[]);
bfs();
for (int i = ; i <= n; ++i)
ans = max(ans, dp(i));
printf("%d\n", ans);
}

Luogu2149 [SDOI2009]Elaxia的路线-最短路+拓扑排序的更多相关文章

  1. 【BZOJ1880】[SDOI2009]Elaxia的路线 (最短路+拓扑排序)

    [SDOI2009]Elaxia的路线 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. \(El ...

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

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

  3. bzoj 1880: [Sdoi2009]Elaxia的路线【spfa+拓扑排序】

    有趣啊 先spfa分别求出以s1,t1,s2,t2为起点的最短路,然后把在s1-->t1或者s2-->t2最短路上的边重新建有向图,跑拓扑最长路即可 #include<iostrea ...

  4. BZOJ 1880: [Sdoi2009]Elaxia的路线( 最短路 + dp )

    找出同时在他们最短路上的边(dijkstra + dfs), 组成新图, 新图DAG的最长路就是答案...因为两人走同一条路但是不同方向也可以, 所以要把一种一个的s,t换一下再更新一次答案 ---- ...

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

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

  6. Luogu P2149 [SDOI2009]Elaxia的路线(最短路+记忆化搜索)

    P2149 [SDOI2009]Elaxia的路线 题意 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们必须合理地安排两个人在一起的 ...

  7. bzoj1880: [Sdoi2009]Elaxia的路线(spfa,拓扑排序最长路)

    1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1944  Solved: 759[Submit][St ...

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

    [BZOJ1880][Sdoi2009]Elaxia的路线(最短路) 题面 BZOJ 洛谷 题解 假装我们知道了任意两点间的最短路,那么我们怎么求解答案呢? 不难发现公共路径一定是一段连续的路径(如果 ...

  9. BZOJ1880: [Sdoi2009]Elaxia的路线(最短路)

    1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2049  Solved: 805 题目链接:https ...

随机推荐

  1. 关于ros将opencv版本固定“写死”的一些想法

    今天主要工作是将ros和zed结合起来,但是发现自己安装了opencv3.1,ros indigo安装的是opencv2.4.8,这就麻烦了,zed支持的是opencv3.1.一开始使用slam2时, ...

  2. java的acm输入输出格式+大数语法

    1.类名称必须采用public class Main方式命名 2.多组输入,读取到文件尾 Scanner scan=new Scanner(System.in); while(scan.hasNext ...

  3. 在webpack构建的项目中使用vue

    一.复习在普通网页中使用vue1.使用script引入vue2.在index中创建 id为app的容器3.通过new vue得到vm实例二.在webpack中尝试使用vue://注意 : 在webpa ...

  4. bootstrap 参考文档

    https://getbootstrap.com/docs/3.3/css/#sass-installation

  5. spring 中 PO与DTO相互转换的工具类

    public class BeanMapper { /** * 持有Dozer单例, 避免重复创建DozerMapper消耗资源. */ private static DozerBeanMapper ...

  6. python学习day5 常量 运算符补充 流程控制基础

    1.常量 值不会改变的量 python中没有特别的语法定义常量,一般约定用全大写字母命名常量,比如圆周率pi 2.预算符补充 2.1算数运算符 print(10/3)除法运算 print(10//3) ...

  7. hibernate 中,出现了错误 "node to traverse cannot be null!" 如何改正

    这个错误基本上是因为hql语句写错了而造成的, 返回找hql输出一下发现, hql语句中间少了几个空格, 写成了String hql = "from"+className+&quo ...

  8. kafka NoNode错误

    报错 bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zookeeper localhost:2181 --group=app-t ...

  9. node搭建简单的本地服务器

    首先要安装node,方法很多,可以去网上找找,可以直接去官网下载安装,新版本的node是自带npm的: 安装好以后,新建一个js文件,名为server.js: let http = require(' ...

  10. openstack(pike 版)集群部署(一)----基础环境部署

    一.环境 1.系统: a.CentOS Linux release 7.4.1708 (Core) b.更新yum源和安装常用软件 #  yum -y install  epel-release ba ...