题目描述

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

Elaxia和w**每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提下,一起走的时间尽可能的长。

现在已知的是Elaxia和w**所在的宿舍和实验室的编号以及学校的地图:地图上有N个路 口,M条路,经过每条路都需要一定的时间。 具体地说,就是要求无向图中,两对点间最短路的最长公共路径。

输入输出格式

输入格式:

第一行:两个整数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。

输出格式:

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

输入输出样例

输入样例#1:
复制

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
输出样例#1: 复制

3

说明

对于30%的数据,N ≤ 100;

对于60%的数据,N ≤ 1000;

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


可证最优解一定是连续的一段,因为两点间的最短路是一定的,所以最优解如果有一段不连续的话两个人走的不相同的两段路的长度也一定相同,也就是说其实可以走一起走一样的路而不用分开走以获得更优解

所以要找的就是同时在两条最短路上的最长的连续重合路径

思路:找出每一条同时在两条最短路上的边,最长的连续段即为所求。

方法:

1.从x1,x2,y1,y2跑4遍spfa

2.穷举每一条边,如果这条边边长+边的一边到x1的距离+另一边到y1的距离=x1到y1的距离 同时x2到y2也符合上述条件则此边在两条最短路上,把此边加入集合

3.重新建图 注意这次要建单向边!! 也就是说只有当一条边在x1到y1的路径上而不是在y1到x1的路径上时才把此边加入

4.从新建的图上找出最长的连续段即为所求



#include<iostream>
#include<stdio.h>
#include<queue>
#include<cstring>
using namespace std;
queue<int> q; int i,m,n,j,k,a[1501][1501],ver[2500001],nex[2500001],head[100001],x[2],y[2],u,v,l,edge[2500001];
int maxx,cnt,fr[2500001],mm[1501];
bool b[1501][1501]; inline int getint()
{
char ch;
int res=0;
while(ch=getchar(),ch<'0'||ch>'9');
res=ch-48;
while(ch=getchar(),ch>='0'&&ch<='9')
res=(res<<3)+(res<<1)+ch-48;
return res;
} void add(int x,int y,int z)
{
cnt+=1;
ver[cnt]=y;
nex[cnt]=head[x];
head[x]=cnt;
edge[cnt]=z;
fr[cnt]=x;
} int spfa(int x)
{
while(q.size()) q.pop();
q.push(x);
a[x][x]=0;
while(q.size())
{
int t=q.front();
q.pop();
for(int i=head[t];i;i=nex[i])
{
int r=ver[i];
if(a[x][r]>a[x][t]+edge[i])
{
a[x][r]=a[x][t]+edge[i];
q.push(r);
}
}
}
} void tp(int x,int f)
{
for(int i=head[x];i;i=nex[i])
{
int t=ver[i];
if(t==f) continue;
if(mm[x]+edge[i]>mm[t])
{
mm[t]=mm[x]+edge[i];
maxx=max(maxx,mm[t]);
tp(t,x);
}
}
} int main()
{
n=getint(); m=getint(); x[0]=getint(); y[0]=getint(); x[1]=getint(); y[1]=getint();
for(i=1;i<=m;i++)
{
u=getint(); v=getint(); l=getint();
add(u,v,l);
add(v,u,l);
}
memset(a,0x3f,sizeof(a));
spfa(x[0]); spfa(x[1]); spfa(y[0]); spfa(y[1]);
k=cnt; cnt=0; memset(head,0,sizeof(head));
for(i=1;i<=k;i++)
{
if((a[x[0]][fr[i]]+edge[i]+a[y[0]][ver[i]]==a[x[0]][y[0]])&&(a[x[1]][fr[i]]+edge[i]+a[y[1]][ver[i]]==a[x[1]][y[1]]))
add(fr[i],ver[i],edge[i]);
else if((a[x[0]][fr[i]]+edge[i]+a[y[0]][ver[i]]==a[x[0]][y[0]])&&(a[x[1]][ver[i]]+edge[i]+a[y[1]][fr[i]]==a[x[1]][y[1]]))
add(fr[i],ver[i],edge[i]);
}
for(i=1;i<=cnt;i++) if(mm[fr[i]]==0) tp(fr[i],0);
printf("%d",maxx);
}

ps.依然坚持认为我写的跑n遍dijkstra的n2logn的时间复杂度挺好的(我才不会承认它确实只能得28分QAQ

P2149 [SDOI2009]Elaxia的路线的更多相关文章

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

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

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

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

  3. Luogu P2149 [SDOI2009]Elaxia的路线(最短路+记忆化搜索)

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

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

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

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

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

  6. P2149 [SDOI2009]Elaxia的路线[最长公共路径]

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

  7. Luogu P2149 [SDOI2009]Elaxia的路线 | 图论

    题目链接 题解: 题面中给了最简洁清晰的题目描述:"求无向图中,两对点间最短路的最长公共路径". 对于这个问题我们可以先考虑图中的哪些边对这两对点的最短路产生了贡献. 比如说下面这 ...

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

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

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

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

随机推荐

  1. 折半插入排序-ACM题

    第一种实现方式:(本人一开始对cin的使用不是很熟悉,看了一些人得博客详解后才有了第一种方式的实现,自己都被惊讶到了so easy:题目在下面) // // main.cpp // BinaryIns ...

  2. SpringBoot 初体验

    1.Spring Boot 简介 简化Spring应用开发的一个框架 整个Spring技术栈的一个大整合 J2EE开发的一站式解决方案 2.微服务 2014, martin fowler 微服务:架构 ...

  3. Luogu4191:[CTSC2010]性能优化

    传送门 题目翻译:给定两个 \(n\) 次多项式 \(A,B\) 和一个整数 \(C\),求 \(A\times B^C\) 在模 \(x^n\) 意义下的卷积 显然就是个循环卷积,所以只要代入 \( ...

  4. Bzoj4766: 文艺计算姬(Matrix-tree/prufer)

    BZOJ 答案就是 \(n^{m-1}m^{n-1}\) \(prufer\) 证明: \(n\) 中的数字出现 \(m-1\) 次,\(m\) 中出现 \(n-1\) 次,根据 \(prufer\) ...

  5. Java 实时论坛 - Sym 1.4.0 发布

    简介 Sym 是一个用 Java 写的实时论坛,欢迎来体验! 如果你需要搭建一个企业内网论坛,请使用 SymX. 作者 Sym 的主要作者是 Daniel 与 Vanessa,所有贡献者可以在这里看到 ...

  6. Linux下vim(文本编译器)的使用

    vim (文本编译器): Vim是从 vi 发展出来的一个文本编辑器. vim的一些命令操作: 插入命令: a 在光标所在字符后插入 A 在光标所在行尾插入 i 在光标所在字符前插入 I 在光标所在行 ...

  7. Android 解决NestedScrollView 嵌套 RecyclerView出现的卡顿,上拉刷新无效

    解决卡顿的方法最简单的就是设置RecyclerView的android:nestedScrollingEnabled="false",放弃自己的滑动,交给外部的NestedScro ...

  8. Fragment 重叠 遮盖问题

    1.导致Fragment 重叠 和遮盖的原因 主要还是因为Fragment的状态保存机制,当系统内存不足时,Fragment的主Activity被回收,Fragment的实例并没有随之被回收. Act ...

  9. jekyll开发静态网站

    一.Ruby环境安装配置 首先下载ruby安装ruby download ,安装完ruby后,再安装rubyGems:运行gem update --system即可. 然后下载DevKit-mingw ...

  10. 下面有关css选择器的说法错误的是?

    下面有关css选择器的说法错误的是? .intro --- 选择 class="intro" 的所有元素. #firstname --- 选择 id="firstname ...