[SDOI2009]Elaxia的路线

题目描述

最近,\(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:

  1. 9 10
  2. 1 6 7 8
  3. 1 2 1
  4. 2 5 2
  5. 2 3 3
  6. 3 4 2
  7. 3 9 5
  8. 4 5 3
  9. 4 6 4
  10. 4 7 2
  11. 5 8 1
  12. 7 9 1

输出样例#1:

  1. 3

说明

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

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

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

题解

大致题意:给定2个起点和终点,求它们最短路的最长公共路径长度。

标题说的拓扑排序是正解,我发现枚举很简单,就先写了枚举,回头填坑。。。

我们可以跑\(4\)遍\(Dij\),处理出\(s1,t1,s2,t2\)的单源最短路\(dist1,dist2,dist3,dist4\)数组。

然后\(N^2\)枚举两个端点,若

​ $dist1[i]+dist2[i]dist1[t1] &&dist3[i]+dist4[i]dist3[t2] $

 且$dist1[j]+dist2[j]dist1[t1]&&dist3[j]+dist4[j]dist3[t2] $

则\(i,j\)在一条最短路上,\(ans=max(ans,abs(dist1[i]-dist1[j]))\);

这样原数据是可以通过的,但实际上有一个问题,所以被hack了。

就是我们枚举的\(i,j\)可能符合上述条件,但并不在一条最短路上,而是在两条分开的最短路上。

学长告诉我只需要拿个pd数组判一下就可以了。太懒了没有改,所以下面是没有改正的代码。

code:

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cctype>
  6. #include<queue>
  7. #include<cmath>
  8. #define ll long long
  9. #define R register
  10. #define M 2000000
  11. #define N 2000
  12. #define INF 0x3f3f3f3f
  13. using namespace std;
  14. template<typename T>inline void read(T &a){
  15. char c=getchar();T x=0,f=1;
  16. while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
  17. while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
  18. a=f*x;
  19. }
  20. int n,m,h[N],tot,dist1[N],dist2[N],dist3[N],dist4[N];
  21. int vis[N],s1,s2,t1,t2,ans;
  22. struct node{
  23. int nex,to,dis,ord;
  24. }edge[M<<1];
  25. inline void add(R int u,R int v,R int w){
  26. edge[++tot].nex=h[u];
  27. edge[tot].to=v;
  28. edge[tot].dis=w;
  29. h[u]=tot;
  30. }
  31. struct HeapNode{
  32. int u,d;
  33. friend bool operator < (const HeapNode &a,const HeapNode &b){
  34. return a.d>b.d;
  35. }
  36. };
  37. priority_queue<HeapNode> q;
  38. inline void dij(R int s,R int dist[]){
  39. for(R int i=1;i<=n;i++)dist[i]=INF,vis[i]=0;
  40. q.push((HeapNode){s,0});dist[s]=0;
  41. while(!q.empty()){
  42. R int x=q.top().u;q.pop();
  43. if(vis[x])continue;vis[x]=1;
  44. for(R int i=h[x];i;i=edge[i].nex){
  45. R int xx=edge[i].to;
  46. if(dist[xx]>dist[x]+edge[i].dis){
  47. dist[xx]=dist[x]+edge[i].dis;
  48. q.push((HeapNode){xx,dist[xx]});
  49. }
  50. }
  51. }
  52. }
  53. int main(){
  54. read(n);read(m);
  55. read(s1);read(t1);read(s2);read(t2);
  56. for(R int i=1,u,v,w;i<=m;i++){
  57. read(u);read(v);read(w);
  58. add(u,v,w);add(v,u,w);
  59. }
  60. dij(s1,dist1);dij(t1,dist2);
  61. dij(s2,dist3);dij(t2,dist4);
  62. for(R int i=1;i<=n;i++){
  63. if(dist1[i]+dist2[i]!=dist1[t1]||dist3[i]+dist4[i]!=dist3[t2])continue;
  64. for(R int j=1;j<=n;j++){
  65. if(dist1[j]+dist2[j]!=dist1[t1]||dist3[j]+dist4[j]!=dist3[t2])continue;
  66. ans=max(ans,abs(dist1[i]-dist1[j]));
  67. }
  68. }
  69. else printf("%d\n",ans);
  70. return 0;
  71. }

我争取及时填坑,并学习正解-->拓扑排序。。。。

【BZOJ1880】[SDOI2009]Elaxia的路线 (最短路+拓扑排序)的更多相关文章

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

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

  2. Luogu2149 [SDOI2009]Elaxia的路线-最短路+拓扑排序

    Solution 另外$ m <=5e5$. 两条最短路的 最长公共路径 一定是若干条连续的边, 并且满足拓扑序. 于是我们分别 正向 和反向走第二条路径,若该条边同时是两条最短路径上的边, 则 ...

  3. bzoj 1880: [Sdoi2009]Elaxia的路线【spfa+拓扑排序】

    有趣啊 先spfa分别求出以s1,t1,s2,t2为起点的最短路,然后把在s1-->t1或者s2-->t2最短路上的边重新建有向图,跑拓扑最长路即可 #include<iostrea ...

  4. 【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. python学习——练习题(4)

    """ 题目:输入某年某月某日,判断这一天是这一年的第几天? """ import datetime import time from fu ...

  2. 一个简单的AXIS远程调用Web Service示例

    我们通常都将编写好的Web Service发布在Tomcat或者其他应用服务器上,然后通过浏览器调用该Web Service,返回规范的XML文件.但是如果我们不通过浏览器调用,而是通过客户端程序调用 ...

  3. Django的views使用

    这里介绍一下Django中常用的类视图,主要说明在视图中如何接收和传递参数.返回到页面等. 注意,使用这些类视图时,在url中需要加上.as_view(). 我将介绍的内容分为三部分:django的V ...

  4. Tornado 接口的实现

  5. 201671010140. 2016-2017-2 《Java程序设计》java学习第六章

    java学习第六章    本周对与java中的接口,lambda表达式与内部类进行了学习,以下是我在学习中的一些体会:    1.接口: <1>.接口中的所有常量必须是public sta ...

  6. js点击按钮获取验证码倒计时

    //发送验证码倒计时 var clock = ''; var nums = 60; var btn; $("#btnGetVerCode").click(function () { ...

  7. json_encode和json_decode和isset和array_key_exists

    1.json_decode() json_decode — 对 JSON 格式的字符串进行编码         说明 mixed json_decode ( string $json [, bool ...

  8. SpringBoot20 集成SpringSecurity02 -> 利用SpringSecurity进行前后端分离的登录验证

    1 SpirngBoot环境搭建 创建一个SpringBoot项目即可,详情参见三少的相关博文 参考博文 -> 点击前往 SpirngBoot项目脚手架 -> 点击前往 2 引入Spirn ...

  9. 50. Pow(x, n) 幂次方

    [抄题]: mplement pow(x, n), which calculates x raised to the power n (xn). Example 1: Input: 2.00000, ...

  10. 关于mysql自增字段问题

    最近遇到mysql字段的自增问题,需要临时处理一下,然后就顺便补补课,这样就有了这样一篇文章. 1.自增值是什么 他是一个字段属性,是用来创建唯一标识的列的 The AUTO_INCREMENT at ...