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*2];
 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]=0;
 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=1; 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=1; 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,0,sizeof(edge));
 88     memset(head,0,sizeof(head));
 89     num_edge=0;
 90
 91     for (int i=1; 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 }

转载于:https://www.cnblogs.com/refun/p/8685620.html

BZOJ1880:[SDOI2009]Elaxia的路线(最短路,拓扑排序)相关推荐

  1. 【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP

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

  2. BZOJ1880: [Sdoi2009]Elaxia的路线|dijksrtra|暴力

    貌似这题正解是spfa后 什么拓扑排序 其实完全不用酱紫-- 先用dijkstra求出s1 s2 e1 e2 到其他点的单元最短路 的四个数组ds1 ds2 de1 de2 然后枚举所有的 " ...

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

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

  4. [NOIP2017]逛公园 最短路+拓扑排序+dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的有向图,边权为非负整数.求满足路径长度小于等于 $1$ 到 $n$ 最短路 $+k$ 的 $1$ 到 $n$ 的路径条数模 $p$ ,如果有无数条则输出 ...

  5. [SDOI2009]Elaxia的路线

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

  6. 「BZOJ2200」[Usaco2011 Jan] 道路和航线 - 最短路+拓扑排序

    ->点我进原题 [Usaco2011 Jan]道路和航线 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 1116 Solved: 410 Des ...

  7. 有向无环图DAG 拓扑排序 代码解释

    目录: DAG定义 举例描述 实际运用 算法描述 算法实战 算法可视化 定义 在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological ...

  8. POJ4084: 拓扑排序

    拓扑排序 1)基本定义 对于一个有向无环图G=(V,E),V里顶点的线性序列称作一个拓扑序列,该顶点序列满足: 若在有向无环图G中从顶点viv_{i}vi​到vjv_{j}vj​有一条路径,则在序列中 ...

  9. 洛谷2149 Elaxia的路线(dp+最短路)

    QwQ好久没更新博客了,颓废了好久啊,来补一点东西 题目大意 给定两个点对,求两对点间最短路的最长公共路径. 其中\(n,m\le 10^5\) 比较简单吧 就是跑四遍最短路,然后把最短路上的边拿出来 ...

最新文章

  1. pandas dataframe绘制并保存图像
  2. Android 系统(241)---IPv4 or IPv6 优先
  3. css3层级穿透,css页面滑动穿透的两种解决办法
  4. windows一键安装oracle,Oracle在Windows下快速搭建
  5. 登录Ubuntu提示有软件包可以更新
  6. 在Razor中如何引入命名空间?(import namespace in razor view)
  7. Atitit 知识点的体系化 框架与方法 如何了解 看待xxx
  8. matlab新建文件夹
  9. 可视化 | 人物画像的设计方法
  10. Python基础_Day13
  11. 为什么 Go 语言能在中国这么火?
  12. Helm模版开发文档
  13. 【贪玩巴斯】一文通过操作实例——学会 知网专业检索 2022年3月21日
  14. 什么是AWS Athena
  15. 1分钟读懂猫咪免疫流程:怎么打疫苗,必须打的疫苗有哪些
  16. 数据库中间件选型思考和实战
  17. 计算机机房建设标准.doc,Kyztql计算机机房建设标准
  18. 搭建go语言开发环境
  19. 系统设计-网关(一)
  20. Abbkine细胞周期染色试剂盒特色和实验建议

热门文章

  1. HMC支持管理服务器数量及适合POWER6服务器的HMC型号
  2. 当你已经23~男生女生都该看
  3. FL Studio常见问题之通道窗口和步进音序器的设置
  4. Windows下开发Perl程序之环境搭建
  5. 三种方法构建简单的WEB服务器!
  6. RabbitMq(八) SpringBoot整合RabbitMQ 生产者代码实现
  7. abp.net mysql_ABP .Net Core Entity Framework迁移使用MySql数据库
  8. python http get 请求_Python:编写HTTP Server处理GET请求
  9. java阿里系学习经历的小小领悟
  10. 2020重学Go系列:反引号的妙用—结构体里的 Tag 标签