BZOJ1880或洛谷2149 [SDOI2009]Elaxia的路线
BZOJ原题链接
洛谷原题链接
显然最长公共路径是最短路上的一条链。
我们可以把最短路经过的边看成有向边,那么组成的图就是一张\(DAG\),这样题目要求的即是两张\(DAG\)重合部分中的最长链。
重合部分中的最长链可能是同向,可能是反向的,但不可能由反向边和同向边组成,否则就不是\(DAG\)了。
所以我们分别只保留重合部分的同向边、反向边,跑两次拓扑排序求最长链,在两者中取\(\max\)即可。
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N = 1510;
const int M = 2.5e6;
struct dd {
int x, D;
bool operator < (const dd &b) const { return D > b.D; }
};
int fi[N], di[M], ne[M], da[M], cfi[N], cdi[M], cne[M], cda[M], dis_1[N], dis_2[N], dis_3[N], dis_4[N], dis[N], ru[N], tq[N], l, x_1, y_1, x_2, y_2, lc, ma, n;
bool v[N];
priority_queue<dd>q;
inline int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
inline void add(int x, int y, int z)
{
di[++l] = y;
da[l] = z;
ne[l] = fi[x];
fi[x] = l;
}
inline void add_c(int x, int y, int z)
{
cdi[++lc] = y;
cda[lc] = z;
cne[lc] = cfi[x];
cfi[x] = lc;
ru[y]++;
}
inline int maxn(int x, int y){ return x > y ? x : y; }
void dij(int st, int dis[])
{
memset(v, 0, sizeof(v));
int i, x, y;
dis[st] = 0;
q.push((dd){st, 0});
while (!q.empty())
{
x = q.top().x;
q.pop();
if (v[x])
continue;
v[x] = 1;
for (i = fi[x]; i; i = ne[i])
if (dis[y = di[i]] >= dis[x] + da[i])
q.push((dd){y, dis[y] = dis[x] + da[i]});
}
}
void topsort()
{
int i, x, y, head = 0, tail = 0;
for (i = 1; i <= n; i++)
if (!ru[i])
tq[++tail] = i;
while (head ^ tail)
{
x = tq[++head];
ma = maxn(ma, dis[x]);
for (i = cfi[x]; i; i = cne[i])
{
y = cdi[i];
dis[y] = maxn(dis[y], dis[x] + cda[i]);
if (!(--ru[y]))
tq[++tail] = y;
}
}
}
int main()
{
int i, j, m, x, y, z;
n = re();
m = re();
x_1 = re();
y_1 = re();
x_2 = re();
y_2 = re();
for (i = 1; i <= m; i++)
{
x = re();
y = re();
z = re();
add(x, y, z);
add(y, x, z);
}
memset(dis_1, 60, sizeof(dis_1));
memset(dis_2, 60, sizeof(dis_2));
memset(dis_3, 60, sizeof(dis_3));
memset(dis_4, 60, sizeof(dis_4));
dij(x_1, dis_1);
dij(y_1, dis_2);
dij(x_2, dis_3);
dij(y_2, dis_4);
for (i = 1; i <= n; i++)
for (j = fi[i]; j; j = ne[j])
if (!((dis_1[i] + da[j] + dis_2[di[j]]) ^ dis_1[y_1]) && !((dis_3[i] + da[j] + dis_4[di[j]]) ^ dis_3[y_2]))
add_c(i, di[j], da[j]);
topsort();
memset(cfi, 0, sizeof(fi));
memset(dis, 0, sizeof(dis));
lc = 0;
for (i = 1; i <= n; i++)
for (j = fi[i]; j; j = ne[j])
if (!((dis_1[i] + da[j] + dis_2[di[j]]) ^ dis_1[y_1]) && !((dis_4[i] + da[j] + dis_3[di[j]]) ^ dis_3[y_2]))
add_c(i, di[j], da[j]);
topsort();
printf("%d", ma);
return 0;
}
BZOJ1880或洛谷2149 [SDOI2009]Elaxia的路线的更多相关文章
- 洛谷 2149 [SDOI2009]Elaxia的路线
题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的 ...
- 洛谷 P2149 [SDOI2009]Elaxia的路线 解题报告
P2149 [SDOI2009]Elaxia的路线 题目描述 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. Elaxia ...
- 洛谷——P2149 [SDOI2009]Elaxia的路线
P2149 [SDOI2009]Elaxia的路线 题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w每 ...
- 洛谷—— P2149 [SDOI2009]Elaxia的路线
https://www.luogu.org/problem/show?pid=2149 题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两 ...
- 洛谷 P2149 [SDOI2009]Elaxia的路线
题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的 ...
- Luogu 2149 [SDOI2009]Elaxia的路线
感觉这题可以模板化. 听说spfa死了,所以要练堆优化dijkstra. 首先对$x_{1},y_{1},x_{2},y_{2}$各跑一遍最短路,然后扫一遍所有边看看是不是同时在两个点的最短路里面,如 ...
- 【BZOJ1880】[Sdoi2009]Elaxia的路线(最短路)
[BZOJ1880][Sdoi2009]Elaxia的路线(最短路) 题面 BZOJ 洛谷 题解 假装我们知道了任意两点间的最短路,那么我们怎么求解答案呢? 不难发现公共路径一定是一段连续的路径(如果 ...
- 【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP
[BZOJ1880][Sdoi2009]Elaxia的路线 Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起 ...
- BZOJ1880: [Sdoi2009]Elaxia的路线(最短路)
1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2049 Solved: 805 题目链接:https ...
随机推荐
- Python变量以及类型
变量的定义 在程序中,有时我们需要对2个数据进行求和,那么该怎样做呢? 大家类比一下现实生活中,比如去超市买东西,往往咱们需要一个菜篮子,用来进行存储物品,等到所有的物品都购买完成后,在收银台进行结账 ...
- linux下误删目录文件后恢复神器extundelete
原文链接:https://blog.51cto.com/wzlinux/2052835 参考:https://blog.csdn.net/cwg_1992/article/details/463100 ...
- cookie.js插件
/*! cookiejs v1.0.23 | MIT (c) 2018 kenny wong | https://github.com/jaywcjlove/cookie.js */!function ...
- Python数字(Number)
Python 数字数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变数字数据类型得值,将重新分配内存空间. 以下实例在变量赋值时 Number 对象将被创建:var1 = 1var2 ...
- ORM的多表查询详述
ORM的多表查询 ORM最核心与用的最多的地方就是跨表查询了.这里的"跨表查询"分为以下几种:基于对象的跨表查询.基于双下划线的跨表查询.聚合查询.F与Q查询以及分组查询. 下面就 ...
- Activiti的25张表
Activiti流程引擎的运行,背后需要数据库的25张表支持,这25张表, 主要是在流程运行过程中,记录存储一些参与流程的用户主体,以及流程定义的存储,流程执行时候的一些信息,以及流程的历史信息等. ...
- C常量与控制语句
在C语言中定义常量的两种方式 在C语言编程中定义常量有两种方法. const关键字 #define预处理器 1. const关键字 const关键字用于定义C语言编程中的常量. const float ...
- 【JVM底层策略 一】GC roots如何判断对象不可达
查找内存中不再使用的对象 引用计数法 引用计数法就是如果一个对象没有被任何引用指向,则可视之为垃圾.这种方法的缺点就是不能检测到环的存在. 2.根搜索算法 根搜索算法的基本思路就是通过一系列名为”GC ...
- mongo 副本集
副本集配置文件 dbpath=/hwdata/mongodb/datalogpath=/hwdata/mongodb/logs/master.logpidfilepath=/hwdata/mongod ...
- 深入剖析GPU Early Z优化
最近在公司群里同事发了一个UE4关于Mask材质的优化,比如在场景中有大面积的草和树的时候,可以在很大程度上提高效率.这其中的原理就是利用了GPU的特性Early Z,但是它的做法跟我最开始的理解有些 ...