P2149 [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\)。

输出格式:

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

说明

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

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

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


这道题对于现在的我来说,还是很有难度滴。

题目已经像是什么模板的问题:

求无向图中,两对点间最短路的最长公共路径

为什么会产生有选择的最长公共路径?因为最短路不只有一条啊。那么问题来了,如果求出最短路的所有边呢?

这里提供一种比较大众的做法。

对于图\(G\)中两点\(s,t\),用最短路算法求解以\(s\)和\(t\)为起始点的\(diss\)和\(dist\)数组。

那么对于边\(E(u,v,w)\),若它在最短路上,那么一定满足

\(diss[u]+w+dist[v]==diss[t]\)

这样的话,我们就解决了找在最短路上的边的问题。

我们也可以处理出两个人共同经过的一些边。不过需要注意的是,这个题有点诡异,两个人面对面走过一条路居然也算是一起走了!!?

这里有个贪心,他们的最长公共路径一定是一条链(试试反证)

于是我们可以把共同经过的边剥离出来一波操作

不过这里我们讨论拓扑排序的做法

回顾一下拓扑排序,它可以将图的操作按照一定的顺序操作而避免冲突。

我们取Elaxia的最短路集合和他们俩最短路的交集构成一个新的有向图(按照Elaxia的走路方向即可),特殊标记最短路交集的那些边

令\(dp[i]\)代表已经处理节点\(i\)所有前驱节点后所得到的最长公共路径。

转移:\(dp[i]=max(dp[i],dp[pre]+is*w);\)

\(pre\)为某前驱节点,\(is\)表示是否被特殊标记,\(w\)边长


code(常数炒鸡大啊):

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. using namespace std;
  5. const int N=1503;
  6. int n,m,s[5];
  7. struct Edge {int from,to,next,w;}edge[N*N];
  8. int head[N],cnt=0;
  9. int dis[5][N];
  10. void add(int u,int v,int w)
  11. {
  12. edge[++cnt].to=v;edge[cnt].from=u;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt;
  13. }
  14. struct Edge0 {int to,next,w,is;}edge0[N*N];
  15. int head0[N],cnt0=0;
  16. void add0(int u,int v,int w,int is)
  17. {
  18. edge0[++cnt0].to=v;edge0[cnt0].w=w;edge0[cnt0].next=head0[u];edge0[cnt0].is=is;head0[u]=cnt0;
  19. }
  20. queue <int > q;
  21. int used[N],in[N];
  22. void spfa()
  23. {
  24. memset(dis,0x3f,sizeof(dis));
  25. for(int k=1;k<=4;k++)
  26. {
  27. used[s[k]]=1;
  28. dis[k][s[k]]=0;
  29. q.push(s[k]);
  30. while(!q.empty())
  31. {
  32. int u=q.front();
  33. q.pop();
  34. used[u]=0;
  35. for(int i=head[u];i;i=edge[i].next)
  36. {
  37. int v=edge[i].to,w=edge[i].w;
  38. if(dis[k][v]>dis[k][u]+w)
  39. {
  40. dis[k][v]=dis[k][u]+w;
  41. if(!used[v]) {used[v]=1;q.push(v);}
  42. }
  43. }
  44. }
  45. }
  46. }
  47. void build()
  48. {
  49. for(int i=1;i<=cnt;i++)
  50. {
  51. int u=edge[i].from,v=edge[i].to,w=edge[i].w;
  52. if(dis[1][u]+w+dis[2][v]==dis[1][s[2]])
  53. {
  54. if(dis[3][u]+w+dis[4][v]==dis[3][s[4]]||dis[3][v]+w+dis[4][u]==dis[4][s[3]])
  55. add0(u,v,w,1);
  56. else
  57. add0(u,v,w,0);
  58. in[v]++;
  59. }
  60. }
  61. }
  62. int dp[N];
  63. void topo()
  64. {
  65. q.push(s[1]);
  66. while(!q.empty())
  67. {
  68. int u=q.front();
  69. q.pop();
  70. for(int i=head0[u];i;i=edge0[i].next)
  71. {
  72. int v=edge0[i].to,w=edge0[i].w,is=edge0[i].is;
  73. in[v]--;
  74. dp[v]=max(dp[v],dp[u]+is*w);
  75. if(!in[v])
  76. q.push(v);
  77. }
  78. }
  79. }
  80. int main()
  81. {
  82. int u,v,w;
  83. scanf("%d%d",&n,&m);
  84. scanf("%d%d%d%d",s+1,s+2,s+3,s+4);
  85. for(int i=1;i<=m;i++)
  86. {
  87. scanf("%d%d%d",&u,&v,&w);
  88. add(u,v,w),add(v,u,w);
  89. }
  90. spfa();
  91. build();
  92. topo();
  93. printf("%d\n",dp[s[2]]);
  94. return 0;
  95. }

2018.5.24

洛谷 P2149 [SDOI2009]Elaxia的路线 解题报告的更多相关文章

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

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

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

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

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

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

  4. BZOJ1880或洛谷2149 [SDOI2009]Elaxia的路线

    BZOJ原题链接 洛谷原题链接 显然最长公共路径是最短路上的一条链. 我们可以把最短路经过的边看成有向边,那么组成的图就是一张\(DAG\),这样题目要求的即是两张\(DAG\)重合部分中的最长链. ...

  5. 洛谷 2149 [SDOI2009]Elaxia的路线

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

  6. 洛谷 P1972 [SDOI2009]HH的项链 解题报告

    P1972 [SDOI2009]HH的项链 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断 ...

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

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

  8. 洛谷 P2323 [HNOI2006]公路修建问题 解题报告

    P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...

  9. P2149 [SDOI2009]Elaxia的路线

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

随机推荐

  1. PCB之PASTE助焊层和SOLDER阻焊层

    1.PASTE为焊接层,用于SMT贴片元件的焊接,对应的图形为钢网(钢网上的小孔): 2.SOLDER为阻焊层,它代表的是绿油的涂抹区域,且为负片输出(负片输出指的是图形以外的区域为有效区域): PA ...

  2. pandas:字段值插入数据表第一行的解决办法

    1. 问题描述 在对课程表进行数据抽取时,由于课表结构的原因,需要在原始表字段名作为第一行数据,并对原始字段名进行替换. 原始数据如下所示: 2. 解决办法 经思考,此问题可抽象为:在不影响原始数据的 ...

  3. 4358: permu

    4358: permu 链接 分析: 不删除的莫队+可撤销的并查集. 每次询问先固定左端点到一个块内,然后将这些右端点从小到大排序,然后询问的过程中,右端点不断往右走,左端点可能会撤销,但是移动区间不 ...

  4. Spring boot多模块(moudle)中的一个注入错误(Unable to start embedded container; nested exception is org)

    org.springframework.context.ApplicationContextException: Unable to start embedded container; nested ...

  5. ANSYS附加动水质量(westergarrd公式)

    在水工结构的抗震计算中,不可避免的需要考虑动水压力的作用,当前规范中一般是要求将动水压力以附加质量的形式考虑,如果对压力用质量形式考虑有疑惑时,可以这样理解:结构发生振动时,会带动周围的水体发生运动, ...

  6. centos7.2部署vnc服务记录

    不做过多介绍了,下面直接记录下centos7系统下安装配置vncserver的操作记录 0)更改为启动桌面或命令行模式 获取当前系统启动模式 [root@localhost ~]# systemctl ...

  7. D. Bicolorings

    传送门 [http://codeforces.com/contest/1051/problem/D] 题意 相当于有个2列n行得棋盘,棋盘上的格子只能是黑或者白,问你联通块为k得方案数有多少,结果对 ...

  8. filter运行出现 <filter object at 0x000001B68F052828> 判断素数

    刚接触filter时  运行总是出现<filter object at 0x000001B68F052828>  得不到想要的数据 后来发现是因为filter的结果是一个数组 需要 lis ...

  9. Vector,ArrayList, LinkedList的区别

    1.Vector.ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链表的形式进行存储. 2.List中的元素有序.允许有重复的元素,Set中的元素无序.不允许有重复元素. ...

  10. CentOS7 卸载mariadb 安装mysql的过程:

    1. 检查安装的mariadb rpm -qa |grep mariadb 得到已经安装的安装包 mariadb-libs-5.5.56-2.el7.x86_64mariadb-devel-5.5.5 ...