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 ≤ y2 ≤ 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,输入数据保证没有重边和自环。

题解

一开始看点数小,直接强行$SPFA$预处理出第一条路径,然后再$SPFA$第二条路径时记录答案。$TLE$...

  • 首先,分别从$x_1$,$y_1$,$x_2$,$y_2$为源点分别跑一次$SPFA$,记$dis[0][u]$,$dis[1][u]$,$dis[2][u]$,$dis[3][u]$分别为从$x_1$,$y_1$,$x_2$,$y_2$为起始点到点$u$的最短路径。

  • 构建出一个新的有向图,包含$x_1->y_1$和$x_2->y_2$的所有最短路上的边。判断一条边$u->v$是否在$x_1->y_1$的最短路上,就是判断$dis[1][u]+val(u,v)+dis[2][v]==dis[1][y1]$($val(u,v)$为边$u->v$的长度),如果为真,那么在最短路上,为假则不在最短路上。是否在$x_2->y_2$的最短路上同理。

  • 不过要注意一点,因为边的走向可能是$u->v$,也可能是$v->u$。所以,对于一条边必须判断两次(第一次为$u->v$,第二次为$v->u$)。

  • 最后,按照新图的拓扑序,在各个点之间进行递推,求得答案。
 //It is made by Awson on 2017.10.20
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define sqr(x) ((x)*(x))
#define y1 yy
using namespace std;
const int N = ; int n, m, x1, x2, y1, y2, u, v, c;
struct tt {
int to, cost, next;
bool color;
}edge[(N*N>>)+], g[(N*N>>)+];
int path[N+], top, path_g[N+], top_g;
int dist[][N+], ans, cnt[N+], in[N+];
struct node {
int x, val;
node (){
}
node (int _x, int _val) {
x = _x, val = _val;
}
}; void init(int u, int v, int c) {
g[++top_g].to = v;
g[top_g].cost = c;
g[top_g].next = path_g[u];
path_g[u] = top_g;
}
void add(int u, int v, int c) {
edge[++top].to = v;
edge[top].next = path[u];
edge[top].cost = c;
path[u] = top;
}
void topsort() {
queue<node>Q; while (!Q.empty()) Q.pop();
for (int i = ; i <= n; i++) if (!in[i]) Q.push(node(i, ));
while (!Q.empty()) {
int u = Q.front().x, val = Q.front().val; Q.pop();
ans = Max(ans, val);
for (int i = path_g[u]; i; i = g[i].next) {
int v = g[i].to; in[v]--; cnt[v] = Max(cnt[v], val+g[i].cost);
if (!in[v]) Q.push(node(v, cnt[v]));
}
}
}
void SPFA(int x, int t) {
bool vis[N+] = {}; vis[x] = ;
memset(dist[t], /, sizeof(dist[t])); dist[t][x] = ;
queue<int>Q; while (!Q.empty()) Q.pop(); Q.push(x);
while (!Q.empty()) {
int u = Q.front(); Q.pop(); vis[u] = ;
for (int i = path[u]; i; i = edge[i].next) {
int v = edge[i].to;
if (dist[t][v] > dist[t][u]+edge[i].cost) {
dist[t][v] = dist[t][u]+edge[i].cost;
if (!vis[v]) {
vis[v] = ; Q.push(v);
}
}
}
}
}
void work() {
scanf("%d%d%d%d%d%d", &n, &m, &x1, &y1, &x2, &y2);
for (int i = ; i <= m; i++) {
scanf("%d%d%d", &u, &v, &c);
add(u, v, c), add(v, u, c);
}
SPFA(x1, ); SPFA(y1, ); SPFA(x2, ), SPFA(y2, );
for (int u = ; u <= n; u++)
for (int i = path[u]; i; i = edge[i].next) {
int v = edge[i].to;
if (dist[][u]+dist[][v]+edge[i].cost != dist[][y1]) continue;
if (dist[][u]+dist[][v]+edge[i].cost != dist[][y2]) continue;
init(u, v, edge[i].cost); in[v]++;
}
topsort();
memset(path_g, , sizeof(path_g)); top_g = ;
memset(cnt, , sizeof(cnt));
for (int u = ; u <= n; u++)
for (int i = path[u]; i; i = edge[i].next) {
int v = edge[i].to;
if (dist[][u]+dist[][v]+edge[i].cost != dist[][y1]) continue;
if (dist[][u]+dist[][v]+edge[i].cost != dist[][y2]) continue;
init(u, v, edge[i].cost); in[v]++;
}
topsort();
printf("%d\n", ans);
}
int main() {
work();
return ;
}

[SDOI 2009]Elaxia的路线的更多相关文章

  1. 「SDOI 2009」Elaxia的路线

    发现自己这几天智商完全不在线-- 这道题的数据十分的水,怎样都可以艹过去-- 开始想了一个完全错误的算法,枚举一对点,判断这一对点是否同时在两条最短路上,是就用两点之间的路径更新答案.显然这样是错的: ...

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

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

  3. BZOJ 1880: [Sdoi2009]Elaxia的路线( 最短路 + dp )

    找出同时在他们最短路上的边(dijkstra + dfs), 组成新图, 新图DAG的最长路就是答案...因为两人走同一条路但是不同方向也可以, 所以要把一种一个的s,t换一下再更新一次答案 ---- ...

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

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

  5. 洛谷 P2149 [SDOI2009]Elaxia的路线 解题报告

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

  6. [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)

    [BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...

  7. P2149 Elaxia的路线

    P2149 Elaxia的路线 题意简述: 在一个n(n<=1500)个点的无向图里找两对点之间的最短路径的最长重合部分,即在保证最短路的情况下两条路径的最长重合长度(最短路不为一) 思路: 两 ...

  8. 【BZOJ 1880】 [Sdoi2009]Elaxia的路线 (最短路树)

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

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

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

随机推荐

  1. 记录python接口自动化测试--把操作excel文件的方法封装起来(第五目)

    前面补充了如何来操作excel文件,这次把如何获取excel文件的sheet对象.行数.单元格数据的方法进行封装,方便后面调用 handle_excel.py# coding:utf-8 import ...

  2. 原生ajax的请求函数

    ajax:一种请求数据的方式,不需要刷新整个页面:ajax的技术核心是 XMLHttpRequest 对象:ajax 请求过程:创建 XMLHttpRequest 对象.连接服务器.发送请求.接收响应 ...

  3. HTML5 canvas绘制雪花飘落

    Canvas是HTML5新增的组件,它就像一块幕布,可以用JavaScript在上面绘制各种图表.动画等. 没有Canvas的年代,绘图只能借助Flash插件实现,页面不得不用JavaScript和F ...

  4. Jenkins中展示HTML测试报告

    背景:测试报告是用reportNG生成的,属于java自动化测试项目. 1)         安装插件 首先要安装HTML Publisher plugin,这个在插件管理里面搜索并安装即可,如下我已 ...

  5. js回顾(DOM中标签的CRUD,表格等)

    01-DOM中的创建和添加标签 02-删除替换克隆标签 03-全选全不选反选 04-新闻字体 05-表格增删 06-动态生成表格 07-表格隔行变色 08-左到右右到左(将左边的标签移动到右边) 09 ...

  6. SpringBoot的重要特性

    一.Web特性 Spring Boot 提供了spring-boot-starter-web来为Web开发予以支持,spring-boot-starter-web为我们提供了嵌入的Tomcat以及Sp ...

  7. nodejs(1-1)

    http://www.runoob.com/nodejs/nodejs-tutorial.html

  8. Flow简易教程——安装篇

    .mydoc_h1{ margin: 0 0 1em; } .mydoc_h1_a{ color: #2c3e50; text-decoration: none; font-size: 2em; } ...

  9. Trensient的使用介绍

    1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过 ...

  10. 初学Java Web(1)——Web概述

    已经很久没有更新博客了,过年忙着吃喝玩乐,就怠惰了一小下下?幸好这学期新开的课程都比较有趣--Java Web和Android.至少对于我自己来说,既充满挑战,又富有趣味. --[1.Web概述]-- ...