Luogu2149 [SDOI2009]Elaxia的路线-最短路+拓扑排序
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的路线-最短路+拓扑排序的更多相关文章
- 【BZOJ1880】[SDOI2009]Elaxia的路线 (最短路+拓扑排序)
[SDOI2009]Elaxia的路线 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. \(El ...
- BZOJ1880:[SDOI2009]Elaxia的路线(最短路,拓扑排序)
Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...
- bzoj 1880: [Sdoi2009]Elaxia的路线【spfa+拓扑排序】
有趣啊 先spfa分别求出以s1,t1,s2,t2为起点的最短路,然后把在s1-->t1或者s2-->t2最短路上的边重新建有向图,跑拓扑最长路即可 #include<iostrea ...
- BZOJ 1880: [Sdoi2009]Elaxia的路线( 最短路 + dp )
找出同时在他们最短路上的边(dijkstra + dfs), 组成新图, 新图DAG的最长路就是答案...因为两人走同一条路但是不同方向也可以, 所以要把一种一个的s,t换一下再更新一次答案 ---- ...
- 【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP
[BZOJ1880][Sdoi2009]Elaxia的路线 Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起 ...
- Luogu P2149 [SDOI2009]Elaxia的路线(最短路+记忆化搜索)
P2149 [SDOI2009]Elaxia的路线 题意 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们必须合理地安排两个人在一起的 ...
- bzoj1880: [Sdoi2009]Elaxia的路线(spfa,拓扑排序最长路)
1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1944 Solved: 759[Submit][St ...
- 【BZOJ1880】[Sdoi2009]Elaxia的路线(最短路)
[BZOJ1880][Sdoi2009]Elaxia的路线(最短路) 题面 BZOJ 洛谷 题解 假装我们知道了任意两点间的最短路,那么我们怎么求解答案呢? 不难发现公共路径一定是一段连续的路径(如果 ...
- BZOJ1880: [Sdoi2009]Elaxia的路线(最短路)
1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2049 Solved: 805 题目链接:https ...
随机推荐
- 新手必看ES6基础
ES6 基础 一.新的变量声明方式 let/const 与var不同,新的变量声明方式带来了一些不一样的特性,其中最重要的两个特性就是提供了块级作用域与不再具备变量提升. 通过2个简单的例子来说明这两 ...
- nltk的使用
1. 命令行; import nltk nltk.download() #下载相关模型等,...
- depth: working copy\infinity\immediates\files\empty
depth: working copy\infinity\immediates\files\empty 有时间,需要整理下,svn 合并深度这四项:具体的意思.
- Javascript Iterator
[Javascript Iterator] 1.@@iterator Whenever an object needs to be iterated (such as at the beginning ...
- 单元测试框架unittest
单元测试:单元测试,是指对软件中的最小可测试单元进行检查和验证,对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义如:c语言中单元指一个函数,java里单元指一个类,图形化的软件中可以 ...
- PLM修改数据库密码
在WINDCHILL SHELL中执行以下命令: xconfmanager -s wt.pom.dbPassword=数据库密码 -t db/db.properties -p 重启服务
- Mysql 用户 创建与删除(基础1)
Mysql是最流行的关系型数据库管理系统之一,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个 ...
- 算法之LOWB三人组之冒泡排序
排序 冒泡排序(Bubble Sort)时间复杂度为O(n^2) 列表每两个相邻的数,如果前面比后面大,则交换这两个数 一趟排序完成后,则无序区减少一个数,有序区增加一个数. def bubble_s ...
- 数据库类型空间效率探索(三)-char
测试环境 表信息 表数据量22.23万,占用空间44.494M 用到的sql语句 增加列:alter table t_type add column new_column char(1) defaul ...
- centos6与centos7区别
CentOS 6 vs CentOS 7的不同 (1)桌面系统[CentOS6] GNOME 2.x[CentOS7] GNOME 3.x(GNOME Shell) (2)文件系统[CentOS6 ...