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 ...
随机推荐
- linux下网络配置
配置相关 http://bbs.acehat.com/thread-813-1-1.html
- JS----事件3
一 事件对象(event):与特定事件相关且包含有关该事件详细信息的对象通过事件可以触发event对象的元素,鼠标的位置及状态,按下的键等等event对象只在事件发生的过程中才有效非IE浏览器里的ev ...
- 3D 模型
http://www.imooc.com/article/12670
- CentOS7 安装 GitLab
虽然GitHub已经很好了,但是我们必须联上公网才可以使用并且如果不付费的话,你的代码在网上就是公开的!但是在企业环境中,我们公司的代码不希望被公开并且也不想付费给GitHub,这时怎么办呢?我们可以 ...
- Shader基础(渲染管线)
Shader原理部分 渲染绘图管线流程: 1.顶点处理(坐标系的转换) 一个模型有自身的方向(前方,上方,右方等)和中心点,既本地坐标系: 将这个模型放到场景当中,通过场景中的世界坐标原点和世 ...
- python生成Excel图表(通过xlsxwriter)
前面介绍了pandas的简单用法,pandas的数据可以通过matlab第三方包将数据生成报表,但是我想将报表生成在Excel中,这时候就可以借助xlsxwriter第三方包来生成图标 缺点:xl ...
- 第十一章 串 (b1)串匹配
- NumPy 副本和视图
NumPy 副本和视图 副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置. 视图是数据的一个别称或引用,通过该别称或引用亦便可访问.操作原有数据,但原有数 ...
- 网络编程Socket知识点回复
Socket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求. Socket和ServerSocket类库位置java.net包中,ServerSocket用于服务器端,Soc ...
- bootstrap-table 使用遇到的问题总结
问题一:右上角button样式自定义 方法: //修改bootstrap-table右上角按钮样式 $(".table-box .columns-right button").re ...