描述

就是求两对点之间 (s1,t1 和 s2,t2) 最短路的最长重合距离

分析

  • 首先要有可以快速判断一条边是否在最短路上的方法, 可以用SPFA分别跑出以s1, t1, s2, t2四个点为起点的单源最短路, 判断时例如如果 d_s1[u] + d_t1[e.to] + e.dist == d_s1[t1], 那么边就在s1, t1的最短路上.
  • 确定一些在最短路上的边后就可以用拓扑排序求出最长路. 注意把s2, t2反过来再做一次
  • 拓扑排序时注意判断点有没有在最短路上
代码
#include #include #include #include #include using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 1500 + 10; int d_s1[maxn], d_t1[maxn], d_s2[maxn], d_t2[maxn]; struct Edge { int to, dist; }; struct SPFA { int n, m; bool inq[maxn]; vectoredges; vectorG[maxn]; void init(int n) { this->n = n; } void AddEdge(int from, int to, int dist) { edges.push_back((Edge){to, dist}); edges.push_back((Edge){from, dist}); m = edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } void spfa(int *d, int s) { queueQ; memset(inq, 0, sizeof(inq)); for(int i = 1; i <= n; i++) d[i] = INF; Q.push(s); inq[s] = 1; d[s] = 0; while(!Q.empty()) { int u = Q.front(); Q.pop(); inq[u] = 0; for(int i = 0; i < G[u].size(); i++) { Edge& e = edges[G[u][i]]; if(d[e.to] > d[u] + e.dist) { d[e.to] = d[u] + e.dist; if(!inq[e.to]) Q.push(e.to), inq[e.to] = 1; } } } } }g1; struct TOPO { int n, m, d[maxn], d0[maxn]; vectoredges; vectorG[maxn]; void init(int n) { this->n = n; memset(d0, 0, sizeof(d0)); edges.clear(); for(int u = 1; u <= n; u++) G[u].clear(); } void AddEdge(int from, int to, int dist) { edges.push_back((Edge){to, dist}); m = edges.size(); G[from].push_back(m-1); d0[to]++; } int toposort() { queueQ; memset(d, 0, sizeof(d)); for(int u = 1; u <= n; u++) if(G[u].size() != 0 && !d0[u]) Q.push(u); int max_d = 0; while(!Q.empty()) { int u = Q.front(); Q.pop(); max_d = max(max_d, d[u]); for(int i = 0; i < G[u].size(); i++) { Edge& e = edges[G[u][i]]; d[e.to] = max(d[e.to], d[u] + e.dist); if(--d0[e.to] == 0) Q.push(e.to); } } return max_d; } }g2; int main() { int n, m, s1, t1, s2, t2; scanf("%d %d %d %d %d %d", &n, &m, &s1, &t1, &s2, &t2); g1.init(n); for(int i = 0; i < m; i++) { int from, to, dist; scanf("%d %d %d", &from, &to, &dist); g1.AddEdge(from, to, dist); } g1.spfa(d_s1, s1); g1.spfa(d_t1, t1); g1.spfa(d_s2, s2); g1.spfa(d_t2, t2); int ans = 0; g2.init(n); for(int u = 1; u <= n; u++) for(int i = 0; i < g1.G[u].size(); i++) { Edge& e = g1.edges[g1.G[u][i]]; if(d_s1[u] + d_t1[e.to] + e.dist == d_s1[t1] && d_s2[u] + d_t2[e.to] + e.dist == d_s2[t2]) g2.AddEdge(u, e.to, e.dist); } ans = max(ans, g2.toposort()); g2.init(n); for(int u = 1; u <= n; u++) for(int i = 0; i < g1.G[u].size(); i++) { Edge& e = g1.edges[g1.G[u][i]]; if(d_s1[u] + d_t1[e.to] + e.dist == d_s1[t1] && d_s2[e.to] + d_t2[u] + e.dist == d_s2[t2]) g2.AddEdge(u, e.to, e.dist); } ans = max(ans, g2.toposort()); printf("%d\n", ans); return 0; } 

BZOJ-1880-Elaxia的路线-SDOI2009-SPFA+拓扑排序相关推荐

  1. BZOJ1880:[SDOI2009]Elaxia的路线(最短路,拓扑排序)

    Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...

  2. [jzoj 4246] 【五校联考6day2】san {spfa+dfs/spfa+拓扑排序+dp}

    题目 Description 小明经常去N 个地点,其中有些地点之间有直接的无向道路(共M 条这样的道路),可以直接互相到达,这些道路的长短不一.由于小明对这些道路都很熟悉,无论起点和终点在哪里,总能 ...

  3. [BZOJ1880] [Sdoi2009] Elaxia的路线 (SPFA 拓扑排序)

    Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...

  4. bzoj 3355: [Usaco2004 Jan]有序奶牛(拓扑排序+bitset)

    3355: [Usaco2004 Jan]有序奶牛 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 56  Solved: 29 [Submit][S ...

  5. 有向无环图DAG 拓扑排序 代码解释

    目录: DAG定义 举例描述 实际运用 算法描述 算法实战 算法可视化 定义 在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological ...

  6. POJ4084: 拓扑排序

    拓扑排序 1)基本定义 对于一个有向无环图G=(V,E),V里顶点的线性序列称作一个拓扑序列,该顶点序列满足: 若在有向无环图G中从顶点viv_{i}vi​到vjv_{j}vj​有一条路径,则在序列中 ...

  7. [SDOI2009]Elaxia的路线

    https://www.luogu.org/problem/show?pid=2149 题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两 ...

  8. 【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP

    [BZOJ1880][Sdoi2009]Elaxia的路线 Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起 ...

  9. BZOJ1880: [Sdoi2009]Elaxia的路线|dijksrtra|暴力

    貌似这题正解是spfa后 什么拓扑排序 其实完全不用酱紫-- 先用dijkstra求出s1 s2 e1 e2 到其他点的单元最短路 的四个数组ds1 ds2 de1 de2 然后枚举所有的 " ...

  10. bzoj 2330 / AcWing 368 银河 差分约束系统+tarjan缩点+拓扑排序

    怎么最近bzoj一直上不了,莫非是挂了? AcWing的地址:https://www.acwing.com/problem/content/370/ 题意: 银河中的恒星浩如烟海,但是我们只关注那些最 ...

最新文章

  1. Linux:检查当前运行级别的五种方法
  2. 小米半年来最大调整:成立技术委员会,雷军称技术事关生死存亡
  3. WINDOWS2003域控制器禁止U盘
  4. 使用IDEA2017创建java web +maven项目
  5. uvalive5990(坑点蛮多的一道题。。)
  6. ExecutorService学习小记
  7. 200 行代码解读国产数据库阿里 OceanBase 的速度源头!| CSDN 博文精选
  8. text 热敏打印机_ESC/POS热敏打印机示例
  9. codeforces 463A Caisa and Sugar 解题报告
  10. Rhino基础教程---三管混接
  11. 80行代码轻松搞定反向传播神经网络(BPNN)
  12. 搜索关键词优化 助力全网霸屏营销
  13. android 状态栏wifi,【技术贴】教你修改状态栏里的wifi、信号、电量图标(转自论坛)...
  14. 部分和 前缀和 二维前缀和
  15. 制作中英文双语(多语)网站教程, 0基础1小时WordPress建站视频课程 (一步步建站, 一步也不少)
  16. 离散数学 (II) 习题 10
  17. Ubuntu更换国内源
  18. Java 遍历map(Java8)
  19. Zbrush 4R7中的SubTool该怎么添加和删除
  20. Oracle APEX 系列文章3:在阿里云上打造属于你自己的APEX完整开发环境 (安装CentOS, Tomcat, Nginx)

热门文章

  1. Coursera吴恩达《卷积神经网络》课程笔记(2)-- 深度卷积模型:案例研究
  2. [OS复习]程序装入技术、简单存储管理技术
  3. ASP.NET一个网站内存放多个config文件(Web.Config文件中configSource 的用法
  4. SetWindowLong
  5. 3D数学基础:图形与游戏开发---随笔五
  6. List list=new ArrayList()怎么回事
  7. Hi3516A开发--GV7601 硬件设计
  8. 记录一次Socket异常:java.net.SocketException: Connection reset
  9. linux 网卡是块设备吗,什么是网络块设备(Network Block Device)?
  10. 以太坊智能合约安全入门了解一下(下)