Description

最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间。Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提下,一起走的时间尽可能的长。 现在已知的是Elaxia和w所在的宿舍和实验室的编号以及学校的地图:地图上有N个路 口,M条路,经过每条路都需要一定的时间。 具体地说,就是要求无向图中,两对点间最短路的最长公共路径。

solution

题目比较坑,但可以AC.

首先这两个人并不都是从宿舍到实验室,所以要分情况讨论.

然后很容易想到取出两者公共最短路上的边,然后找最长路,注意这里有一点技巧

首先新图中存在环,不能用一般方法,我们就把边弄成单向边,就十分简单了,直接拓扑排序或记忆化搜索就可以弄出答案了.

具体方法就是我们强制规定边的方向,如从 \(x1->y1\) 最后做两边即可

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cstdio>
  6. #include <vector>
  7. #include <queue>
  8. #include <cmath>
  9. #define RG register
  10. #define il inline
  11. #define iter iterator
  12. #define Max(a,b) ((a)>(b)?(a):(b))
  13. #define Min(a,b) ((a)<(b)?(a):(b))
  14. using namespace std;
  15. const int N=1505;
  16. int head[N],nxt[N*N],to[N*N],num=1,n,m,dis[N*N],S1,S2,T1,T2;
  17. void link(int x,int y,int z){
  18. nxt[++num]=head[x];to[num]=y;head[x]=num;dis[num]=z;}
  19. int f[5][N],mod=N*10,q[N*10];bool vis[N],mark[N];
  20. void spfa(int STA,int t){
  21. memset(f[t],127/3,sizeof(f[t]));
  22. memset(vis,0,sizeof(vis));
  23. int x,u,tail=0,sum=1;q[1]=STA;vis[STA]=1;f[t][STA]=0;
  24. while(tail!=sum){
  25. tail++;if(tail==mod)tail=0;x=q[tail];
  26. for(int i=head[x];i;i=nxt[i]){
  27. u=to[i];
  28. if(f[t][x]+dis[i]<f[t][u]){
  29. f[t][u]=f[t][x]+dis[i];
  30. if(!vis[u]){
  31. vis[u]=true;
  32. sum++;if(sum==mod)sum-=mod;q[sum]=u;
  33. }
  34. }
  35. }
  36. vis[x]=false;
  37. }
  38. }
  39. vector<int>G[2][N];int du[2][N],g[N],ans=0,D[N][N];bool inst[N];
  40. queue<int>que;
  41. void solve(bool t){
  42. int x,u;
  43. memset(g,0,sizeof(g));while(!que.empty())que.pop();
  44. for(int i=1;i<=n;i++)if(!du[t][i] && inst[i])que.push(i),g[i]=0;
  45. while(!que.empty()){
  46. x=que.front();que.pop();ans=Max(ans,g[x]);
  47. for(int i=0,Sz=G[t][x].size();i<Sz;i++){
  48. u=G[t][x][i];du[t][u]--;if(!du[t][u])que.push(u);
  49. g[u]=Max(g[u],g[x]+D[x][u]);
  50. }
  51. }
  52. }
  53. void work()
  54. {
  55. int x,y,z;
  56. scanf("%d%d",&n,&m);
  57. scanf("%d%d%d%d",&S1,&T1,&S2,&T2);
  58. for(int i=1;i<=m;i++){
  59. scanf("%d%d%d",&x,&y,&z);
  60. link(x,y,z);link(y,x,z);
  61. }
  62. spfa(S1,1);spfa(T1,2);spfa(S2,3);spfa(T2,4);
  63. int fr,ti;
  64. for(int i=2;i<=num;i++){
  65. fr=to[i];ti=to[i^1];
  66. if(f[1][fr]+f[2][ti]+dis[i]!=f[1][T1])continue;
  67. if(f[3][fr]+f[4][ti]+dis[i]!=f[3][T2])continue;
  68. G[0][fr].push_back(ti);du[0][ti]++;inst[fr]=inst[ti]=true;
  69. D[fr][ti]=D[ti][fr]=dis[i];
  70. }
  71. solve(0);
  72. memset(inst,0,sizeof(inst));
  73. for(int i=2;i<=num;i++){
  74. fr=to[i];ti=to[i^1];
  75. if(f[1][ti]+f[2][fr]+dis[i]!=f[1][T1])continue;
  76. if(f[3][fr]+f[4][ti]+dis[i]!=f[3][T2])continue;
  77. G[1][ti].push_back(fr);du[1][fr]++;inst[fr]=inst[ti]=true;
  78. D[fr][ti]=D[ti][fr]=dis[i];
  79. }
  80. solve(1);
  81. printf("%d\n",ans);
  82. }
  83. int main()
  84. {
  85. work();
  86. return 0;
  87. }

bzoj 1880: [Sdoi2009]Elaxia的路线的更多相关文章

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

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

  2. bzoj 1880 [Sdoi2009]Elaxia的路线(最短路+拓扑序)

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

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

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

  4. 【BZOJ 1880】 [Sdoi2009]Elaxia的路线 (最短路树)

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. WORK

    团队展示 队伍信息 队名:小狗队 队长:刘映华(201421122021) 队员:兰运良(201421122030).郭和水(201421122017) 团队项目描述 团队项目描述是基于之前的四则运算 ...

  2. iOS极光推送SDK的使用流程

    一.极光推送简介 极光推送是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,整合了iOS.Android和WP平台的统一推送服务.使用起来方便简单,已于集成,解决了原生远程推送繁 ...

  3. 团队作业4——第一次项目冲刺(Alpha版本)2017.11.19

    第三次会议:2017-11-16 第二次会议讨论的还没有完全实现,于是在第三次会议上对此进行了一些对我们工作上的看法,得出结论:多花时间啊!!!! 又没照照片图: 会议主要内容: 1.登录注册完善 2 ...

  4. 创建带缩进的XML

    from xml.etree import ElementTree as ET from xml.dom import minidom root = ET.Element('}) son=ET.Sub ...

  5. iOS开发-OC中TabView的编辑

    UITableView编辑 1> UITableView 编辑流程 2> UITableView 编辑步骤(四步) ① 第一步 : 让 TableView 处于编辑状态(在按钮点击事件方法 ...

  6. 《招一个靠谱的移动开发》iOS面试题及详解(上篇)

    以下问题主要用于技术的总结与回顾 主要问题总结 单例的写法.在单利中创建数组应该注意些什么. NSString 的时候用copy和strong的区别. 多线程.特别是NSOperation 和 GCD ...

  7. 完美解决某法院HP EVA8400删除VDISK问题

    [故障描述] 某地法院一台HP EVA8400存储,2组扩展柜,物理磁盘由12个1T FATA磁盘(AG691A 454414-001)和10个300G 15K FC磁盘(AG690A 454411- ...

  8. PM2使用心得

    PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控.自动重启.负载均衡等,而且使用非常简单. 安装 npm install -g pm2 常用命令 $ npm i ...

  9. windows安装虚拟主机virtualbox遇到的困难

    本来想到可以在windows安装虚拟主机virtualbox,但是怎么自己的windows是盗版的,由于主题已经被破解了,所以不能安装结果强制性的进入pe然后从网上下载的dll文件复制到 c/wind ...

  10. 使用 HttpClient3.1 和 HtmlParser2.1 开发Crawler

    https://www.ibm.com/developerworks/cn/opensource/os-cn-crawler/