传送门啦

分析:

我最开始想的是跑两遍最短路,然后记录一下最短路走了哪些边(如果有两条最短路就选经过边多的),打上标记。两边之后找两次都标记的边有多少就行了。

但。。。我并没有实现出来。

最后让我们看一下正解:

四边spfa+拓扑排序求最长边

先让我们考虑如何求两对点最短路的最长公共路径?

1.先明白:如果有一条边,它的起点到最短路的起点 + 终点到最短路的终点 + 边权 == 最短路起点到终点的距离,那么这条边一定在最短路上。

也就是说如果有一条边i:from -> to权值是w在最短路x -> y上,那么有disx->from + disto->y + edge[i].w == disx->y

2.所以就可以把两条最短路径都经过的边重新建图

3.最后就是求最长路即可(显然图是DAG 拓扑排序可以求)。

注意!!注意!!注意!!

1.最开始我们建的是无向图,也就是说:dis_{from->to} + wdisfrom−>to​+w 和 dis_{to->from} + wdisto−>from​+w是一样的。

2.重新建图的时候我们建的是有向图。

最短路和普通的spfaspfa没什么区别,稍微改了一下dis数组,那样就不用开4个dis了。

拓扑序也差不多,ind[i]ind[i]表示第ii点的入度。

总体来说,这个题主要还是想法,还有对基础算法的应用。挺好一个题。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = ; inline int read(){
char ch = getchar(); int f = , x = ;
while(ch > '' || ch < ''){if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = (x << ) + (x << ) + ch - ''; ch = getchar();}
return x * f;
} int n,m,x,y,xx,yy,u,v,w;
struct Edge{
int from,to,next,val;
int tag;
}edge[maxn * maxn] , e[maxn * maxn];
int head1[maxn],tot1,head2[maxn],tot2;
int dis[][maxn],ind[maxn];
bool vis[maxn];
int f[maxn]; void add(int u,int v,int w){
edge[++tot1].to = v;
edge[tot1].from = u;
edge[tot1].next = head1[u];
edge[tot1].val = w;
head1[u] = tot1;
} void addedge(int u,int v,int w){
e[++tot2].from = u;
e[tot2].to = v;
e[tot2].val = w;
e[tot2].next = head2[u];
head2[u] = tot2;
} void spfa(int s,int flag){
queue<int> q;
for(int i=;i<=n;i++) dis[flag][i] = 1e9;
memset(vis,false,sizeof(vis));
q.push(s);
dis[flag][s] = ; vis[s] = true;
while(!q.empty()){
int cur = q.front();
q.pop(); vis[cur] = false;
for(int i=head1[cur];i;i=edge[i].next){
int v = edge[i].to;
if(dis[flag][v] > dis[flag][cur] + edge[i].val){
dis[flag][v] = dis[flag][cur] + edge[i].val;
if(vis[v] == ){
q.push(v);
vis[v] = true;
}
}
}
}
} inline void topo(){
queue<int> que;
que.push(x);
while(!que.empty()){
int cur = que.front();
que.pop();
for(int i=head2[cur];i;i=e[i].next){
int v = e[i].to , w = e[i].val;
--ind[v];
if(!ind[v]) {
que.push(v);
f[v] = max(f[v] , f[cur] + e[i].tag * w);
}
}
}
} void rebuild(){
for(int i=;i<=tot1;i++){
int v = edge[i].to , u = edge[i].from , w = edge[i].val;
if(dis[][u] + w + dis[][v] == dis[][y]){
addedge(u , v , w);
if(dis[][u] + w + dis[][v] == dis[][yy] || dis[][v] + w + dis[][u] == dis[][yy])
//为了处理无向图的问题
e[tot2].tag = ;
ind[v]++;
}
}
} int main(){
n = read(); m = read();
x = read(); y = read(); xx = read(); yy = read();
for(int i=;i<=m;i++){
u = read(); v = read(); w = read();
add(u , v , w);
add(v , u , w);
}
spfa(x , );
spfa(y , );
spfa(xx , );
spfa(yy , );
rebuild();
topo();
printf("%d\n",f[y]);
return ;
}

洛谷P2149 Elaxia的路线的更多相关文章

  1. 洛谷2149 Elaxia的路线(dp+最短路)

    QwQ好久没更新博客了,颓废了好久啊,来补一点东西 题目大意 给定两个点对,求两对点间最短路的最长公共路径. 其中\(n,m\le 10^5\) 比较简单吧 就是跑四遍最短路,然后把最短路上的边拿出来 ...

  2. P2149 Elaxia的路线

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

  3. 洛谷 P4478 [BJWC2018]上学路线

    洛谷 P4478 [BJWC2018]上学路线 原题 神仙题orz,竟然没有1A....容斥+卢卡斯+crt?? 首先用容斥做,记\(f[i][0/1]\)表示到i号点经过了奇数/偶数个点的方案数,因 ...

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

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

  5. 洛谷——P2149 [SDOI2009]Elaxia的路线

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

  6. 【模板】矩阵快速幂 洛谷P2233 [HNOI2002]公交车路线

    P2233 [HNOI2002]公交车路线 题目背景 在长沙城新建的环城公路上一共有8个公交站,分别为A.B.C.D.E.F.G.H.公共汽车只能够在相邻的两个公交站之间运行,因此你从某一个公交站到另 ...

  7. Java实现 洛谷 Car的旅行路线

    输入输出样例 输入样例#1: 1 3 10 1 3 1 1 1 3 3 1 30 2 5 7 4 5 2 1 8 6 8 8 11 6 3 输出样例#1: 47.5 import java.util. ...

  8. 洛谷 P2149 [SDOI2009]Elaxia的路线

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

  9. 洛谷—— P2149 [SDOI2009]Elaxia的路线

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

随机推荐

  1. Go_20: Golang 中 time 包的使用

    time包中包括两类时间:时间点(某一时刻)和时常(某一段时间) 1. 时间常量(时间格式化) const ( ANSIC = "Mon Jan _2 15:04:05 2006" ...

  2. Java基础-IO流对象之转换流(InputStreamReader与OutoutStreamWriter)

    Java基础-IO流对象之转换流(InputStreamReader与OutoutStreamWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.转换流概述 我们之前 ...

  3. java基础-引用数据类型之一维数组(Array)

    java基础-引用数据类型之一维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组的定义 1>.为什么需要数组 保存一个数据可以定义一个变量,如果要保 ...

  4. day4 数组学习

    java提供的数组排序操作:java.util.Arrays.sort(数组名): java提供的数组复制:system.arraycopy(源数组名称,源数组开始点下标,目标数组名称,目标数组开始下 ...

  5. Linux下内存映射文件的用法简介

    由于项目需要,所以学习了一下Linux下内存映射文件的用法,在这里共享一下自己的收获,希望大家提出宝贵意见,进行交流. 简介: 内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区 ...

  6. mongo转换副本集

    本文介绍如何把独立的mongo实例转换成包含3个成员的副本集.开发和测试使用独立实例,生产使用副本集.如何安装独立的mongo实例本文不再赘述. 如果在部署副本集时还没有安装mongo实例,可以查看部 ...

  7. APScheduler定时执行外加supervisor管理后台运行

    最近写的天气爬虫想要让它在后台每天定时执行,一开始用的celery,但不知道为什么明明设置cron在某个时间运行,但任务却不间断的运行.无奈转用apscheduler,但是不管怎么设置都不能使得当调用 ...

  8. springcloud入门系列(二):注册中心Eureka

    搭建注册中心Eureka 1.pom中依赖 <dependencies> <dependency> <groupId>org.springframework.clo ...

  9. 用一张图片解释清楚jQuery中10个强大的遍历函数

    为什么我们要进一步提炼一系列元素,难道是jQuery选择语法不够强大?让我们从示例开始.在下面提到的网页中,当一个star被点击时,我们需要给它以及左边的每个star添加class"on&q ...

  10. jquery php ajax多图片上传.上传进度,生成缩略图

    本例用到其他2个php class.upload.php和 functions.php还有css和js以及img文件 下载地址为www.freejs.net/demo/91/down.zip 演示 J ...