Description

  最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间。Elaxia和w**每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提下,一起走的时间尽可能的长。 现在已知的是Elaxia和w**所在的宿舍和实验室的编号以及学校的地图:地图上有N个路 口,M条路,经过每条路都需要一定的时间。
  具体地说,就是要求无向图中,两对点间最短路的最长公共路径。

Input

  第一行:两个整数N和M(含义如题目描述)。 第二行:四个整数x1、y1、x2、y2(1 ≤ x1 ≤ N,1 ≤ y1 ≤ N,1 ≤ x2 ≤ N,1 ≤ ≤ N),分别表示Elaxia的宿舍和实验室及w**的宿舍和实验室的标号(两对点分别 x1,y1和x2,y2)。 接下来M行:每行三个整数,u、v、l(1 ≤ u ≤ N,1 ≤ v ≤ N,1 ≤ l ≤ 10000),表 u和v之间有一条路,经过这条路所需要的时间为l。 出出出格格格式式式::: 一行,一个整数,表示每天两人在一起的时间(即最长公共路径的长度)。

Output

  一行,一个整数,表示每天两人在一起的时间(即最长公共路径的长度)

Sample Input

9 10
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

3

HINT

  对于30%的数据,N ≤ 100;
  对于60%的数据,N ≤ 1000;
  对于100%的数据,N ≤ 1500,输入数据保证没有重边和自环。

Source

  Day2

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 & 拓扑排序)的更多相关文章

  1. bzoj1880: [Sdoi2009]Elaxia的路线(spfa,拓扑排序最长路)

    1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1944  Solved: 759[Submit][St ...

  2. [luogu2149][bzoj1880][SDOI2009]Elaxia的路线【拓扑排序+最短路+DP】

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

  3. BZOJ1880: [Sdoi2009]Elaxia的路线(最短路)

    1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2049  Solved: 805 题目链接:https ...

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

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

  5. BZOJ1880: [Sdoi2009]Elaxia的路线

    题意:求最短路最长公共距离. 考虑每一条边,如果满足dis(s1,u)+len+dis(v,t1)==dis(s1,t1) && dis(s2,u)+len+dis(v,t2)==di ...

  6. BZOJ1880 [Sdoi2009]Elaxia的路线 【最短路 + dp】

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

  7. 【BZOJ1880】[SDOI2009]Elaxia的路线 (最短路+拓扑排序)

    [SDOI2009]Elaxia的路线 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. \(El ...

  8. BZOJ-1880 Elaxia的路线 SPFA+枚举

    1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 921 Solved: 354 [Submit][Sta ...

  9. 【BZOJ1880】[Sdoi2009]Elaxia的路线(最短路)

    [BZOJ1880][Sdoi2009]Elaxia的路线(最短路) 题面 BZOJ 洛谷 题解 假装我们知道了任意两点间的最短路,那么我们怎么求解答案呢? 不难发现公共路径一定是一段连续的路径(如果 ...

随机推荐

  1. NoSQLBooster for MongoDB的基本使用

    连接 File -> Quik Connect ( Ctrl + Shift + N ) 或 Connect -> From URI 填入 mongodb://username:passw ...

  2. Go生成easyjson文件

    [生成easyjson文件] cd services/api_adapter/aliafp   #先删除已有的aliafp_easyjson.go文件,并且把除了aliafp.go以外的其他文件移动到 ...

  3. Go语言极速入门手册

    Github: https://github.com/coderzh/CodeTips /* gotips_test.go: Golang速学速查速用代码手册 Source: github.com/c ...

  4. 浅谈PHP答题卡识别(一)

    最近期末考试考完了,我们也要放寒假了.于是突发奇想,想用PHP写一个答题卡识别程序.已经实现了一些,现分享给大家. 具体的步骤如下: 上传答题卡=>图片二值化(已实现)=>寻找定位点(已实 ...

  5. 基于jquery的城市选择插件

    城市选择插件的难度不是很大,主要是对dom节点的操作.而我写的这个插件相对功能比较简答,没有加入省市联动. 上代码好了,参照代码的注释应该比较好理解. /* *基于jquery的城市选择插件 *aut ...

  6. 安装 LightGBM 包的过程

    conda install cmake conda install gcc git clone --recursive https://github.com/Microsoft/LightGBM ; ...

  7. 创建Maven web工程不能解析EL表达式的解决办法

    在web.xml中讲头部改为: <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee&qu ...

  8. 浏览器输入URL到响应页面的全过程

    B/S网络架构从前端到后端都得到了简化,都基于统一的应用层协议HTTP来交互数据,HTTP协议采用无状态的短链接的通信方式,通常情况下,一次请求就完成了一次数据交互,通常也对应一个业务逻辑,然后这次通 ...

  9. 关于C/S框架网单表绑定,查询

    这种绑定暂时支持单表,并且不支持主键自增长!保存,删除,查看,修改用框架现成的. 1.先生成tb.bll.dal三个类.框架有生成工具,在debug文件里面有个叫CSFramework.Tools.C ...

  10. 如何遍历 Windows 摄像头设备?

    #include <stdlib.h> #include <iostream> #include <Windows.h> #include <comdef.h ...