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 ...
随机推荐
- JAVA语言 第四周
oh my god! 说实话,上周的目标没有完成. 这一周过的太随便了,比刚放假时候的热情减少的太多了. 具体干了啥,就不说了吧.好像什么完整的事都没有干~~~~~ 不过一直在完善代码,已经能实现部分 ...
- pipy国内镜像的网址
pipy国内镜像目前有:豆瓣 http://pypi.douban.com/simple/阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大学 https: ...
- 关于U3D图片的压缩格式
http://blog.sina.com.cn/s/blog_930ffa0b0102vass.html
- putty加了密钥ssh不能登陆,PuTTY:server refused our key问题的解决(转)
直接上方法:禁用系统的selinux功能,命令#setenforce0,但重启系统,selinux仍然启用.根治方法:更改SElinux的配置文件/etc/selinux/config,修改SELIN ...
- burpsuite的使用(三)
send to repeater 手动提交,注入. 将post请求改成get请求 直接就可以看到页面 生成csrf POC代码 点击在浏览器中测试,copy 拿到浏览器里访问 或者拷贝出来 保存到文本 ...
- hibench 对CDH5.13.1进行基准测试(测试项目hadoop\spark\)HDFS作HA高可靠性
使用CDH 5.13.1部署了HADOOP集群之后,需要进行基准性能测试. 一.hibench 安装 1.安装位置要求. 因为是全量安装,其中有SPARK的测试(SPARK2.0). 安装位置在SPA ...
- Gym - 101911B Glider(前缀和+二分)
传送门:点我 A plane is flying at a constant height of hh meters above the ground surface. Let's consider ...
- PTA 7-33 地下迷宫探索(深搜输出路径)
地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...
- f5负载均衡算法
负载均衡使用一种算法或公式来确定由哪一个后台服务器接收流量 负载均衡是基于连接的 1.静态负载均衡算法:以固定方式分发连接 轮询算法(Round Robin):将请求依次顺序循环地分发给服务器,从1到 ...
- Python: 高阶函数与lambda表达式
缘由: python语法简单一看就会,但用在实处,想因为少于实战,总感觉有些捉襟. 翻阅跟踪youtube_dl源码,看到filter()函数用法,及其中lambda表达式,感觉好有意思,就补下课,记 ...