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

Solution

数组开小了WA,开大了MLE……emmm
四个点每个点spfa各跑一边最短路,
然后选定以一个人为标准重新建图
怎么建呢?枚举每个边,判断其在不在最短路内就好了
做题的时候忘了很不应该,CF的时候还做过一个类似的判断边是否在最短路上的题
注意要建单向边
然后拓扑排序求最长链,那么这个链就是两人最短路的最长相交了。

Code

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<queue>
  5. #define N (1500+10)
  6. #define M (500000+10)
  7. using namespace std;
  8. struct node
  9. {
  10. int to,next,len;
  11. } edge[M*];
  12. int head[N],num_edge;
  13. int n,m,x1,x2,y1,y2,len,p,ans;
  14. int u[M],v[M],l[M],Ind[N],dis[N];
  15. int disx1[N],disx2[N],disy1[N],disy2[N],used[N];
  16. queue<int>q;
  17.  
  18. void add(int u,int v,int l)
  19. {
  20. edge[++num_edge].to=v;
  21. edge[num_edge].next=head[u];
  22. edge[num_edge].len=l;
  23. head[u]=num_edge;
  24. }
  25.  
  26. void Spfa(int s,int *dis)
  27. {
  28. dis[s]=;
  29. used[s]=true;
  30. q.push(s);
  31. while (!q.empty())
  32. {
  33. int x=q.front();
  34. q.pop();
  35. for (int i=head[x]; i; i=edge[i].next)
  36. if (dis[x]+edge[i].len<dis[edge[i].to])
  37. {
  38. dis[edge[i].to]=dis[x]+edge[i].len;
  39. if (!used[edge[i].to])
  40. {
  41. used[edge[i].to]=true;
  42. q.push(edge[i].to);
  43. }
  44. }
  45. used[x]=false;
  46. }
  47. }
  48.  
  49. void Toposort()
  50. {
  51. for (int i=; i<=n; ++i)
  52. if (!Ind[i]) q.push(i);
  53. while (!q.empty())
  54. {
  55. int x=q.front();
  56. q.pop();
  57. for (int i=head[x]; i; i=edge[i].next)
  58. {
  59. Ind[edge[i].to]--;
  60. dis[edge[i].to]=max(dis[edge[i].to],dis[x]+edge[i].len);
  61. ans=max(ans,dis[edge[i].to]);
  62. if (!Ind[edge[i].to])
  63. q.push(edge[i].to);
  64. }
  65. }
  66. }
  67.  
  68. int main()
  69. {
  70. scanf("%d%d",&n,&m);
  71. scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
  72. for (int i=; i<=m; ++i)
  73. {
  74. scanf("%d%d%d",&u[i],&v[i],&l[i]);
  75. add(u[i],v[i],l[i]);
  76. add(v[i],u[i],l[i]);
  77. }
  78. memset(disx1,0x7f,sizeof(disx1));
  79. memset(disy1,0x7f,sizeof(disy1));
  80. memset(disx2,0x7f,sizeof(disx2));
  81. memset(disy2,0x7f,sizeof(disy2));
  82. Spfa(x1,disx1);
  83. Spfa(x2,disx2);
  84. Spfa(y1,disy1);
  85. Spfa(y2,disy2);
  86.  
  87. memset(edge,,sizeof(edge));
  88. memset(head,,sizeof(head));
  89. num_edge=;
  90.  
  91. for (int i=; i<=m; ++i)
  92. {
  93. int len1=min(disx1[u[i]],disx1[v[i]]) + l[i] + min(disy1[u[i]],disy1[v[i]]);
  94. int len2=min(disx2[u[i]],disx2[v[i]]) + l[i] + min(disy2[u[i]],disy2[v[i]]);
  95. if (len1!=disx1[y1] || len2!=disx2[y2]) continue;
  96. if (disx1[u[i]]<disx1[v[i]]) add(u[i],v[i],l[i]),Ind[v[i]]++;
  97. else add(v[i],u[i],l[i]),Ind[u[i]]++;
  98. }
  99. Toposort();
  100. printf("%d",ans);
  101. }

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

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

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

  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. Java基础(3)——变量

    从这篇文章起开始正式进入正题啦,本文将较为简单的介绍一下变量以及常量.变量,顾名思义,就是可以变的量,常量那么久相反了,常常不变的量就叫常量._(¦3」∠) 变量 在 Java 中,任何一个变量都得有 ...

  2. groovy普通方法、抽象方法、接口、trait

    /** * Created by Jxy on 2018/12/21 14:07 * trait关键字 * 声明trait中的方法和任何常规方法一样 * trait声明抽象方法需要在实现类中实现 * ...

  3. 判断数组内是否有几个元素之和等于m

    #include<iostream> using namespace std; ]; int f(int n,int m) { ||m-a[n]==); &&m-a[n]! ...

  4. 关于 Table 表格那些三两事儿

    引言 实现下列表格样式,嵌套与form表单中提交信息,为了让自己的表格可以“ 随心所欲 ” 变换自己的形式,需要两个重要的td 属性colspan 列合并 以及 rowspan 行合并 来实现,表格宽 ...

  5. LeetCode赛题----Find Left Most Element

    问题描述 Given a binary tree, find the left most element in the last row of the tree. Example 1: Input: ...

  6. LeetCode赛题391----Perfect Rectangle

    #391. Perfect Rectangle Given N axis-aligned rectangles where N > 0, determine if they all togeth ...

  7. 注解@Slf4j

    介绍 常见的Slf4j日志打印有两种方式,分别为传统方式和注解方式. 1.传统方式 示例: package com.example.demo.controller; import org.slf4j. ...

  8. latex 图形的放置

         Next: 16.3 清除未处理的浮动图形 Up: 16. 浮动图形环境 Previous: 16.1 创建浮动图形  16.2 图形的放置 图形(figure)环境有一个可选参数项允许用户 ...

  9. SSM 框架-05-详细整合教程(Eclipse版)(Spring+SpringMVC+MyBatis)

    SSM 框架-05-详细整合教程(Eclipse版)(Spring+SpringMVC+MyBatis) 如果你使用的是 Intellij IDEA,请查看: SSM的配置流程详细的写了出来,方便很少 ...

  10. 八、angularjs 中 filter在controller中的使用--避免多次遍历

    filter在html页面的使用司空见惯,比如: filter在controller中使用可以避免多次使用angular.foreach,来进行遍历.例如: 如果使用filter,则会让代码简洁而且明 ...