[BZOJ1880] [Sdoi2009] Elaxia的路线 (SPFA & 拓扑排序)
Description
Input
Output
Sample Input
1 6 7 8
1 2 1
2 5 2
2 3 3
3 4 2
3 9 5
4 5 3
4 6 4
4 7 2
5 8 1
7 9 1
Sample Output
HINT
对于30%的数据,N ≤ 100;
对于60%的数据,N ≤ 1000;
对于100%的数据,N ≤ 1500,输入数据保证没有重边和自环。
Source
Solution
补个条件:$m\leq 500000$
如果$dis_{s->u_i}+w_i=dis_{t->v_i}$,那么边$i$才可能成为答案
这些边组成的图一定是一个拓扑图,走一遍最长链即可。
其实主要的坑点在于因为是无向图,所以需要反着做一遍
也就是说,$x_1$->$y_1$和$y_2$->$x_2$的公共路径也可能是答案,也就是说,原题意是错的= =b
#include <bits/stdc++.h>
using namespace std;
struct edge
{
int v, w, nxt;
}e[];
int fst[][], dis[][], q[], indeg[];
int n, etot, sss1, ttt1, sss2, ttt2;
bool inq[]; void addedge(int *f, int u, int v, int w)
{
e[++etot] = (edge){v, w, f[u]}, f[u] = etot;
} bool check(int u, int i)
{
if(dis[][u] + e[i].w + dis[][e[i].v] != dis[][ttt1]) return false;
return dis[][u] + e[i].w + dis[][e[i].v] == dis[][ttt2];
} void SPFA(int sss, int *d)
{
int front = , back;
memset(d, , );
q[back = ] = sss, d[sss] = , inq[sss] = true;
while(front != back)
{
int u = q[++front & ];
front &= , inq[u] = false;
for(int i = fst[][u]; i; i = e[i].nxt)
if(d[e[i].v] > d[u] + e[i].w)
{
d[e[i].v] = d[u] + e[i].w;
if(!inq[e[i].v])
{
q[++back & ] = e[i].v;
back &= , inq[e[i].v] = true;
}
}
}
} int Topo_sort()
{
int front = , back = , ans = ;
for(int i = ; i <= n; ++i)
if(!indeg[i]) q[++back] = i;
while(front != back)
{
int u = q[++front];
for(int i = fst[][u]; i; i = e[i].nxt)
{
int v = e[i].v, w = e[i].w;
dis[][v] = max(dis[][v], dis[][u] + w);
if(!--indeg[e[i].v]) q[++back] = v;
}
}
for(int i = ; i <= n; ++i)
ans = max(ans, dis[][i]);
return ans;
} int main()
{
int m, u, v, w, ans;
scanf("%d%d", &n, &m);
scanf("%d%d%d%d", &sss1, &ttt1, &sss2, &ttt2);
for(int i = ; i <= m; ++i)
{
scanf("%d%d%d", &u, &v, &w);
addedge(fst[], u, v, w);
addedge(fst[], v, u, w);
}
SPFA(sss1, dis[]), SPFA(ttt1, dis[]);
SPFA(sss2, dis[]), SPFA(ttt2, dis[]);
for(int i = ; i <= n; ++i)
for(int j = fst[][i]; j; j = e[j].nxt)
if(check(i, j))
{
addedge(fst[], i, e[j].v, e[j].w);
++indeg[e[j].v];
}
ans = Topo_sort();
memset(fst[], , sizeof(fst[]));
memset(dis[], , sizeof(dis[]));
memset(indeg, , sizeof(indeg));
swap(sss2, ttt2);
SPFA(sss2, dis[]), SPFA(ttt2, dis[]);
for(int i = ; i <= n; ++i)
for(int j = fst[][i]; j; j = e[j].nxt)
if(check(i, j))
{
addedge(fst[], i, e[j].v, e[j].w);
++indeg[e[j].v];
}
ans = max(ans, Topo_sort());
printf("%d\n", ans);
return ;
}
[BZOJ1880] [Sdoi2009] Elaxia的路线 (SPFA & 拓扑排序)的更多相关文章
- bzoj1880: [Sdoi2009]Elaxia的路线(spfa,拓扑排序最长路)
1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1944 Solved: 759[Submit][St ...
- [luogu2149][bzoj1880][SDOI2009]Elaxia的路线【拓扑排序+最短路+DP】
题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希望在节约时间 ...
- BZOJ1880: [Sdoi2009]Elaxia的路线(最短路)
1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2049 Solved: 805 题目链接:https ...
- BZOJ1880:[SDOI2009]Elaxia的路线(最短路,拓扑排序)
Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...
- BZOJ1880: [Sdoi2009]Elaxia的路线
题意:求最短路最长公共距离. 考虑每一条边,如果满足dis(s1,u)+len+dis(v,t1)==dis(s1,t1) && dis(s2,u)+len+dis(v,t2)==di ...
- BZOJ1880 [Sdoi2009]Elaxia的路线 【最短路 + dp】
题目 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提 ...
- 【BZOJ1880】[SDOI2009]Elaxia的路线 (最短路+拓扑排序)
[SDOI2009]Elaxia的路线 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. \(El ...
- BZOJ-1880 Elaxia的路线 SPFA+枚举
1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 921 Solved: 354 [Submit][Sta ...
- 【BZOJ1880】[Sdoi2009]Elaxia的路线(最短路)
[BZOJ1880][Sdoi2009]Elaxia的路线(最短路) 题面 BZOJ 洛谷 题解 假装我们知道了任意两点间的最短路,那么我们怎么求解答案呢? 不难发现公共路径一定是一段连续的路径(如果 ...
随机推荐
- PHP基础点滴
PHP基础点滴 双冒号::的用法: 双冒号操作符即作用域限定操作符Scope Resolution Operator可以访问静态.const和类中重写的属性与方法. 伪类型(pseudo-types) ...
- [bzoj2286][Sdoi 2011]消耗战
[bzoj2286]消耗战 标签: 虚树 DP 题目链接 题解 很容易找出\(O(mn)\)的做法. 只需要每次都dp一遍. 但是m和n是同阶的,所以这样肯定会T的. 注意到dp的时候有很多节点是不需 ...
- Ubantu16.04 redis安装
通过FTP方式将redis的安装包从windows上传到linux上 解压命令:$sudo tar -zxf ~/Downloads/redis-3.2.7.tar.gz -C /usr/local ...
- Eclipse (eclipse-jee-luna-SR2-win32)4.4.2 , jdk1.7, pydev 4.5.5版本的 完成的python环境集成
说明: 下面的搭建python2.x环境需要的条件: jdk1.7 eclipse(版本小于4.5) pydev(版本小于5.0) Eclipse和PyDev搭建完美Python开发环境 Window ...
- WEB服务器防盗链_HttpAccessKeyModule_Referer(Nginx&&PHP)
盗链的概念指在自己的页面上展示一些并不在自己服务器上的内容.也就是获得他人服务器上的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容.如,小站盗用大站的图片.音乐.视频.软件等 ...
- 随笔︱MRO-Microsoft R Open使用心得与相应内容总结
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 往期回顾: 新工具︱微软Microsoft ...
- WaitForSingleObject函数
WaitForSingleObject函数 VC声明 DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); VB声明 D ...
- Jlink 烧写Uboot
第一章 Hi3531_SDK_Vx.x.x.x版本升级操作说明 如果您是首次安装本SDK,请直接参看第2章. 第二章首次安装SDK 1.Hi3531 SDK包位置 在"Hi3531_V100 ...
- 笔记本CPU低压和标压有什么区别?
笔记本CPU英文称Mobile CPU(移动CPU),它除了追求性能,也追求低热量和低耗电,最早的笔记本电脑直接使用台式机的CPU,但是随CPU主频的提高, 笔记本电脑狭窄的空间不能迅速散发CPU产生 ...
- XP硬盘读写速度很慢的解决方法
05购入的电脑,今日仍在发挥余热,但系统速度慢得出奇.今日检测了硬盘读写速度还不到2m/s,实在令人难以接受.一查之下,硬盘被置为PIO模式了,难怪. 用以下方法得以解决: 1.对桌面"我的 ...