1880: [Sdoi2009]Elaxia的路线

Time Limit: 4 Sec  Memory Limit: 64 MB
Submit: 1944  Solved: 759
[Submit][Status][Discuss]

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

Source

  1. /*
  2. 如何求两对点最短路的最长公共路径?
  3. 开始的想法是对两个起点spfa,但对于如何求多条最短路经过的所有点没有思路
  4. 注意到其实本质是求最长路,只是需要一个图......
  5. 正解是4遍spfa,若某条边满足起点和终点分别到这条边最短路+这条路长等于起点到终点的最短路
  6. 那么这条边一定在最短路上。
  7. 所以就可以把1,2最短路径都经过的边重建图(注意若某条边不是被同向经过也要算)
  8. 这就有图了...求最长路即可(显然图是DAG 拓扑排序可以求)。
  9. */
  10. #include<bits/stdc++.h>
  11.  
  12. #define N 2005
  13. #define M 1000007
  14. #define inf 0x3f3f3f3f
  15.  
  16. using namespace std;
  17. struct node{
  18. int u,v,w,nxt,f;
  19. }e[M<<],E[M<<];
  20. queue<int>q;
  21. int n,m,cnt,cnt2;
  22. int head[N],p[],d[][N],Head[N];
  23. int in[N],f[N],v[N];
  24.  
  25. void add(int u,int v,int w)
  26. {
  27. e[++cnt].u=u;e[cnt].v=v;e[cnt].w=w;
  28. e[cnt].nxt=head[u]; head[u]=cnt;
  29. }
  30.  
  31. void add_(int u,int v,int w)
  32. {
  33. E[++cnt2].u=u;E[cnt2].v=v;E[cnt2].w=w;
  34. E[cnt2].nxt=Head[u]; Head[u]=cnt2;
  35. }
  36.  
  37. void spfa(int x)
  38. {
  39. memset(v,,sizeof v);
  40. for(int i=;i<=n;++i) if(i!=p[x]) d[x][i]=inf;
  41. q.push(p[x]);v[p[x]]=;
  42. while(!q.empty())
  43. {
  44. int now=q.front();q.pop();v[now]=;
  45. for(int i=head[now];i;i=e[i].nxt)
  46. {
  47. int to=e[i].v;
  48. if(d[x][to]>d[x][now]+e[i].w)
  49. {
  50. d[x][to]=d[x][now]+e[i].w;
  51. if(!v[to]) v[to]=,q.push(to);
  52. }
  53. }
  54. }
  55. }
  56.  
  57. void rebuild()
  58. {
  59. for(int i=;i<=cnt;++i)
  60. if(d[][e[i].u]+e[i].w+d[][e[i].v]==d[][p[]])
  61. {
  62. add_(e[i].u,e[i].v,e[i].w);
  63. if(d[][e[i].u]+e[i].w+d[][e[i].v]==d[][p[]] || d[][e[i].u]+e[i].w+d[][e[i].v]==d[][p[]])
  64. E[cnt2].f=;
  65. in[e[i].v]++;
  66. }
  67. }
  68.  
  69. void Tsort()
  70. {
  71. while(!q.empty()) q.pop();
  72. q.push(p[]);
  73. int now;
  74. while(!q.empty())
  75. {
  76. now=q.front(); q.pop();
  77. for(int i=Head[now];i;i=E[i].nxt)
  78. {
  79. --in[E[i].v];
  80. if(!in[E[i].v])
  81. {
  82. q.push(E[i].v);
  83. f[E[i].v]=max(f[E[i].v],f[now]+E[i].w*E[i].f);
  84. }
  85. }
  86. }
  87. }
  88.  
  89. int main()
  90. {
  91. int x,y,z;
  92. scanf("%d%d",&n,&m);
  93. for(int i=;i<=;++i) scanf("%d",&p[i]);
  94. for(int i=;i<=m;++i)
  95. {
  96. scanf("%d%d%d",&x,&y,&z);
  97. add(x,y,z),add(y,x,z);
  98. }
  99. for(int i=;i<=;++i) spfa(i);
  100. rebuild();
  101. Tsort();
  102. printf("%d",f[p[]]);
  103. return ;
  104. }

bzoj1880: [Sdoi2009]Elaxia的路线(spfa,拓扑排序最长路)的更多相关文章

  1. [BZOJ1880] [Sdoi2009] Elaxia的路线 (SPFA & 拓扑排序)

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

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

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

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

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

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

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

  5. BZOJ1880: [Sdoi2009]Elaxia的路线

    题意:求最短路最长公共距离. 考虑每一条边,如果满足dis(s1,u)+len+dis(v,t1)==dis(s1,t1) && dis(s2,u)+len+dis(v,t2)==di ...

  6. BZOJ1880 [Sdoi2009]Elaxia的路线 【最短路 + dp】

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

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

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

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

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

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

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

随机推荐

  1. Eclipse Myeclipse 设定文件的默认打开方式

    Eclipse Myeclipse 设定文件的默认打开方式   菜单:Window -> Preferences -> General -> Editors -> File A ...

  2. noip模拟赛 数颜色

    分析:高级数据结构学傻了.....一眼看上去觉得是莫队,发现带修改,于是分块,由于写的常数很大,只有70分. 正解很简单,记录下颜色为c的每只兔子的位置,每次二分找这个区间有多少只这种颜色的兔子就可以 ...

  3. PatentTips – EMC Virtual File System

    BACKGROUND OF THE INVENTION 1. Field of the Invention The present invention generally relates to net ...

  4. VIM使用技巧15

    在vim的插入模式下,有时需要插入寄存器中的文本: 1.使用<C-r>{register} 2.使用<C-r><C-p>{register} 3.使用<C-r ...

  5. codeforces 691F(组合数计算)

    Couple Cover, a wildly popular luck-based game, is about to begin! Two players must work together to ...

  6. Pivotal Cloud Foundry安全原理解析

    云计算相关的技术差点儿都对传统网络架构和安全规则产生一定的冲击.Pivotal Cloud Foundry(PCF)也不例外,去年8月为了说服专业安全组织允许PaaS部署方案,特意为他们深入讲了下PC ...

  7. 查找olr备份路径

    使用:ocrdump -local <olr_dump_name> more <olr_dump_name> 来查找 [SYSTEM.OLR.BACKUP.LOC] 的相应键值 ...

  8. 静态链表的C++实现

    静态链表是使用数组实现的能够高速插入和删除数据的链表,静态链表和链式单链表比的缺点在于链表的长度仅仅能初始化设置好,而相相应普通的顺序存储的链表,静态链表不能实现高速的读写随意的元素. 当然静态链表给 ...

  9. iOS NSMutableDictionary中UIImage的存储和读取

    思路:将UIImage转换成NSData,然后插入到NSMutableDictionary中.读取时,用NSData读出来,然后再转换成UIImage -存储 UIImage *image = [se ...

  10. Unity3D &amp; C# 设计模式--23

     Unity3D & C#Design Patterns 23 design patterns. Creational Patterns 1. Abstract Factory抽象工厂 创 ...