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. JAVA语言 第四周

    oh my god! 说实话,上周的目标没有完成. 这一周过的太随便了,比刚放假时候的热情减少的太多了. 具体干了啥,就不说了吧.好像什么完整的事都没有干~~~~~ 不过一直在完善代码,已经能实现部分 ...

  2. pipy国内镜像的网址

    pipy国内镜像目前有:豆瓣 http://pypi.douban.com/simple/阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大学 https: ...

  3. 关于U3D图片的压缩格式

    http://blog.sina.com.cn/s/blog_930ffa0b0102vass.html

  4. putty加了密钥ssh不能登陆,PuTTY:server refused our key问题的解决(转)

    直接上方法:禁用系统的selinux功能,命令#setenforce0,但重启系统,selinux仍然启用.根治方法:更改SElinux的配置文件/etc/selinux/config,修改SELIN ...

  5. burpsuite的使用(三)

    send to repeater 手动提交,注入. 将post请求改成get请求 直接就可以看到页面 生成csrf POC代码 点击在浏览器中测试,copy 拿到浏览器里访问 或者拷贝出来 保存到文本 ...

  6. hibench 对CDH5.13.1进行基准测试(测试项目hadoop\spark\)HDFS作HA高可靠性

    使用CDH 5.13.1部署了HADOOP集群之后,需要进行基准性能测试. 一.hibench 安装 1.安装位置要求. 因为是全量安装,其中有SPARK的测试(SPARK2.0). 安装位置在SPA ...

  7. Gym - 101911B Glider(前缀和+二分)

    传送门:点我 A plane is flying at a constant height of hh meters above the ground surface. Let's consider ...

  8. PTA 7-33 地下迷宫探索(深搜输出路径)

    地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...

  9. f5负载均衡算法

    负载均衡使用一种算法或公式来确定由哪一个后台服务器接收流量 负载均衡是基于连接的 1.静态负载均衡算法:以固定方式分发连接 轮询算法(Round Robin):将请求依次顺序循环地分发给服务器,从1到 ...

  10. Python: 高阶函数与lambda表达式

    缘由: python语法简单一看就会,但用在实处,想因为少于实战,总感觉有些捉襟. 翻阅跟踪youtube_dl源码,看到filter()函数用法,及其中lambda表达式,感觉好有意思,就补下课,记 ...