【BZOJ1880】[Sdoi2009]Elaxia的路线

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

题解:先从x1,y1,x2都跑一边最短路,这样我们就可以快速判断一条边是否在最短路上了。最后从y2跑最短路,然后用f[x]表示从y2走到x时最长公共路径的长度。边最短路边DP即可。

然而好像被hack了。。。还是看大爷的题解吧。

#include <cstring>
#include <cstdio>
#include <iostream>
#include <queue>
#include <utility>
#define mp(A,B) make_pair(A,B)
using namespace std;
typedef pair<int,int> pii;
int n,m,cnt,S1,S2,T1,T2,la,lb;
int to[1000010],next[1000010],val[1000010],head[10010],dis[4][10010],vis[10010],f[10010];
priority_queue<pii> q;
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void dijkstra(int S,int t)
{
int i,u;
memset(vis,0,sizeof(vis));
dis[t][S]=0,q.push(mp(0,S));
while(!q.empty())
{
u=q.top().second,q.pop();
if(vis[u]) continue;
vis[u]=1;
for(i=head[u];i!=-1;i=next[i]) if(dis[t][to[i]]>dis[t][u]+val[i])
dis[t][to[i]]=dis[t][u]+val[i],q.push(mp(-dis[t][to[i]],to[i]));
}
}
inline void add(int a,int b,int c)
{
to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
}
int main()
{
n=rd(),m=rd(),S1=rd(),T1=rd(),S2=rd(),T2=rd();
int i,a,b,c,u,v;
memset(head,-1,sizeof(head));
for(i=1;i<=m;i++) a=rd(),b=rd(),c=rd(),add(a,b,c),add(b,a,c);
memset(dis,0x3f,sizeof(dis));
dijkstra(S1,0),dijkstra(T1,1),dijkstra(S2,2),la=dis[0][T1],lb=dis[2][T2];
memset(vis,0,sizeof(vis));
dis[3][T2]=0,q.push(mp(0,T2));
while(!q.empty())
{
u=q.top().second,q.pop();
if(vis[u]) continue;
vis[u]=1;
for(i=head[u];i!=-1;i=next[i])
{
v=to[i];
if(dis[3][v]>dis[3][u]+val[i])
{
dis[3][v]=dis[3][u]+val[i],f[v]=0;
q.push(mp(-dis[3][v],v));
}
if(dis[3][v]==dis[3][u]+val[i])
{
f[v]=max(f[v],f[u]+val[i]*((dis[1][u]+dis[0][v]+val[i]==la||dis[0][u]+dis[1][v]+val[i]==la)&&(dis[3][u]+dis[2][v]+val[i]==lb||dis[2][u]+dis[3][v]+val[i]==lb)));
}
}
}
printf("%d",f[S2]);
return 0;
}//3 2 1 2 1 3 1 2 1 2 3 1

最新文章

  1. Kafka1 利用虚拟机搭建自己的Kafka集群
  2. Python模块:hashlib
  3. MongoDB的安装 转
  4. windows 自动关机命令
  5. SQL Server 的事务和锁(一)
  6. 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT) – 整理
  7. strace
  8. mysql 中创建存储过程
  9. Round Numbers (排列组合)
  10. Linux SD/MMC/SDIO驱动分析
  11. MEAN栈开发
  12. Code Kata:大整数比较大小&amp;大整数四则运算---加减法 javascript实现
  13. Java语言的分支
  14. SSM-MyBatis-16:Mybatis中延迟加载
  15. [03] SpringBoot+MyBatis+Shiro搭建杂谈
  16. HDU - 6393 Traffic Network in Numazu(树链剖分+基环树)
  17. 清空库数据sql
  18. [剑指Offer]快排
  19. Java中使用多线程、curl及代理IP模拟post提交和get访问
  20. 对Prolog的感想和我写的一些教程

热门文章

  1. HTML5 Canvas 绘制库存变化折线 计算出最高最低库存
  2. 利用Bootstrap制作一个流行的网页
  3. Android RecyclerView 使用解析
  4. web 前端 常见操作 将时间戳转成日期格式 字符串截取 使用mui制作选项卡
  5. C中的C文件与h文件辨析(转)
  6. WebLogic92数据源配置
  7. hdu 3641 数论 二分求符合条件的最小值数学杂题
  8. ie6、ie7下JSON.parse JSON未定义的解决方法
  9. Android应用APP脱壳笔记
  10. iOS-Gif图片展示N种方式(原生+第三方)