BZOJ1880:[SDOI2009]Elaxia的路线(最短路,拓扑排序)
Description
Input
Output
Sample Input
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
HINT
对于30%的数据,N ≤ 100;
对于60%的数据,N ≤ 1000;
对于100%的数据,N ≤ 1500,输入数据保证没有重边和自环。
Solution
数组开小了WA,开大了MLE……emmm
四个点每个点spfa各跑一边最短路,
然后选定以一个人为标准重新建图
怎么建呢?枚举每个边,判断其在不在最短路内就好了
做题的时候忘了很不应该,CF的时候还做过一个类似的判断边是否在最短路上的题
注意要建单向边
然后拓扑排序求最长链,那么这个链就是两人最短路的最长相交了。
Code
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- #include<queue>
- #define N (1500+10)
- #define M (500000+10)
- using namespace std;
- struct node
- {
- int to,next,len;
- } edge[M*];
- int head[N],num_edge;
- int n,m,x1,x2,y1,y2,len,p,ans;
- int u[M],v[M],l[M],Ind[N],dis[N];
- int disx1[N],disx2[N],disy1[N],disy2[N],used[N];
- queue<int>q;
- void add(int u,int v,int l)
- {
- edge[++num_edge].to=v;
- edge[num_edge].next=head[u];
- edge[num_edge].len=l;
- head[u]=num_edge;
- }
- void Spfa(int s,int *dis)
- {
- dis[s]=;
- used[s]=true;
- q.push(s);
- while (!q.empty())
- {
- int x=q.front();
- q.pop();
- for (int i=head[x]; i; i=edge[i].next)
- if (dis[x]+edge[i].len<dis[edge[i].to])
- {
- dis[edge[i].to]=dis[x]+edge[i].len;
- if (!used[edge[i].to])
- {
- used[edge[i].to]=true;
- q.push(edge[i].to);
- }
- }
- used[x]=false;
- }
- }
- void Toposort()
- {
- for (int i=; i<=n; ++i)
- if (!Ind[i]) q.push(i);
- while (!q.empty())
- {
- int x=q.front();
- q.pop();
- for (int i=head[x]; i; i=edge[i].next)
- {
- Ind[edge[i].to]--;
- dis[edge[i].to]=max(dis[edge[i].to],dis[x]+edge[i].len);
- ans=max(ans,dis[edge[i].to]);
- if (!Ind[edge[i].to])
- q.push(edge[i].to);
- }
- }
- }
- int main()
- {
- scanf("%d%d",&n,&m);
- scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
- for (int i=; i<=m; ++i)
- {
- scanf("%d%d%d",&u[i],&v[i],&l[i]);
- add(u[i],v[i],l[i]);
- add(v[i],u[i],l[i]);
- }
- memset(disx1,0x7f,sizeof(disx1));
- memset(disy1,0x7f,sizeof(disy1));
- memset(disx2,0x7f,sizeof(disx2));
- memset(disy2,0x7f,sizeof(disy2));
- Spfa(x1,disx1);
- Spfa(x2,disx2);
- Spfa(y1,disy1);
- Spfa(y2,disy2);
- memset(edge,,sizeof(edge));
- memset(head,,sizeof(head));
- num_edge=;
- for (int i=; i<=m; ++i)
- {
- int len1=min(disx1[u[i]],disx1[v[i]]) + l[i] + min(disy1[u[i]],disy1[v[i]]);
- int len2=min(disx2[u[i]],disx2[v[i]]) + l[i] + min(disy2[u[i]],disy2[v[i]]);
- if (len1!=disx1[y1] || len2!=disx2[y2]) continue;
- if (disx1[u[i]]<disx1[v[i]]) add(u[i],v[i],l[i]),Ind[v[i]]++;
- else add(v[i],u[i],l[i]),Ind[u[i]]++;
- }
- Toposort();
- printf("%d",ans);
- }
BZOJ1880:[SDOI2009]Elaxia的路线(最短路,拓扑排序)的更多相关文章
- 【BZOJ1880】[SDOI2009]Elaxia的路线 (最短路+拓扑排序)
[SDOI2009]Elaxia的路线 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. \(El ...
- Luogu2149 [SDOI2009]Elaxia的路线-最短路+拓扑排序
Solution 另外$ m <=5e5$. 两条最短路的 最长公共路径 一定是若干条连续的边, 并且满足拓扑序. 于是我们分别 正向 和反向走第二条路径,若该条边同时是两条最短路径上的边, 则 ...
- bzoj 1880: [Sdoi2009]Elaxia的路线【spfa+拓扑排序】
有趣啊 先spfa分别求出以s1,t1,s2,t2为起点的最短路,然后把在s1-->t1或者s2-->t2最短路上的边重新建有向图,跑拓扑最长路即可 #include<iostrea ...
- 【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP
[BZOJ1880][Sdoi2009]Elaxia的路线 Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起 ...
- bzoj1880: [Sdoi2009]Elaxia的路线(spfa,拓扑排序最长路)
1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1944 Solved: 759[Submit][St ...
- BZOJ1880: [Sdoi2009]Elaxia的路线(最短路)
1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2049 Solved: 805 题目链接:https ...
- BZOJ 1880: [Sdoi2009]Elaxia的路线( 最短路 + dp )
找出同时在他们最短路上的边(dijkstra + dfs), 组成新图, 新图DAG的最长路就是答案...因为两人走同一条路但是不同方向也可以, 所以要把一种一个的s,t换一下再更新一次答案 ---- ...
- Luogu P2149 [SDOI2009]Elaxia的路线(最短路+记忆化搜索)
P2149 [SDOI2009]Elaxia的路线 题意 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们必须合理地安排两个人在一起的 ...
- [luogu2149][bzoj1880][SDOI2009]Elaxia的路线【拓扑排序+最短路+DP】
题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希望在节约时间 ...
随机推荐
- Java基础(3)——变量
从这篇文章起开始正式进入正题啦,本文将较为简单的介绍一下变量以及常量.变量,顾名思义,就是可以变的量,常量那么久相反了,常常不变的量就叫常量._(¦3」∠) 变量 在 Java 中,任何一个变量都得有 ...
- groovy普通方法、抽象方法、接口、trait
/** * Created by Jxy on 2018/12/21 14:07 * trait关键字 * 声明trait中的方法和任何常规方法一样 * trait声明抽象方法需要在实现类中实现 * ...
- 判断数组内是否有几个元素之和等于m
#include<iostream> using namespace std; ]; int f(int n,int m) { ||m-a[n]==); &&m-a[n]! ...
- 关于 Table 表格那些三两事儿
引言 实现下列表格样式,嵌套与form表单中提交信息,为了让自己的表格可以“ 随心所欲 ” 变换自己的形式,需要两个重要的td 属性colspan 列合并 以及 rowspan 行合并 来实现,表格宽 ...
- LeetCode赛题----Find Left Most Element
问题描述 Given a binary tree, find the left most element in the last row of the tree. Example 1: Input: ...
- LeetCode赛题391----Perfect Rectangle
#391. Perfect Rectangle Given N axis-aligned rectangles where N > 0, determine if they all togeth ...
- 注解@Slf4j
介绍 常见的Slf4j日志打印有两种方式,分别为传统方式和注解方式. 1.传统方式 示例: package com.example.demo.controller; import org.slf4j. ...
- latex 图形的放置
Next: 16.3 清除未处理的浮动图形 Up: 16. 浮动图形环境 Previous: 16.1 创建浮动图形 16.2 图形的放置 图形(figure)环境有一个可选参数项允许用户 ...
- SSM 框架-05-详细整合教程(Eclipse版)(Spring+SpringMVC+MyBatis)
SSM 框架-05-详细整合教程(Eclipse版)(Spring+SpringMVC+MyBatis) 如果你使用的是 Intellij IDEA,请查看: SSM的配置流程详细的写了出来,方便很少 ...
- 八、angularjs 中 filter在controller中的使用--避免多次遍历
filter在html页面的使用司空见惯,比如: filter在controller中使用可以避免多次使用angular.foreach,来进行遍历.例如: 如果使用filter,则会让代码简洁而且明 ...