洛谷P2149 Elaxia的路线
传送门啦
分析:
我最开始想的是跑两遍最短路,然后记录一下最短路走了哪些边(如果有两条最短路就选经过边多的),打上标记。两边之后找两次都标记的边有多少就行了。
但。。。我并没有实现出来。
最后让我们看一下正解:
四边spfa+拓扑排序求最长边
先让我们考虑如何求两对点最短路的最长公共路径?
1.先明白:如果有一条边,它的起点到最短路的起点 + 终点到最短路的终点 + 边权 == 最短路起点到终点的距离,那么这条边一定在最短路上。
也就是说如果有一条边i:from -> to权值是w在最短路x -> y上,那么有disx->from + disto->y + edge[i].w == disx->y
2.所以就可以把两条最短路径都经过的边重新建图
3.最后就是求最长路即可(显然图是DAG 拓扑排序可以求)。
注意!!注意!!注意!!
1.最开始我们建的是无向图,也就是说:dis_{from->to} + wdisfrom−>to+w 和 dis_{to->from} + wdisto−>from+w是一样的。
2.重新建图的时候我们建的是有向图。
最短路和普通的spfaspfa没什么区别,稍微改了一下dis数组,那样就不用开4个dis了。
拓扑序也差不多,ind[i]ind[i]表示第ii点的入度。
总体来说,这个题主要还是想法,还有对基础算法的应用。挺好一个题。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = ; inline int read(){
char ch = getchar(); int f = , x = ;
while(ch > '' || ch < ''){if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = (x << ) + (x << ) + ch - ''; ch = getchar();}
return x * f;
} int n,m,x,y,xx,yy,u,v,w;
struct Edge{
int from,to,next,val;
int tag;
}edge[maxn * maxn] , e[maxn * maxn];
int head1[maxn],tot1,head2[maxn],tot2;
int dis[][maxn],ind[maxn];
bool vis[maxn];
int f[maxn]; void add(int u,int v,int w){
edge[++tot1].to = v;
edge[tot1].from = u;
edge[tot1].next = head1[u];
edge[tot1].val = w;
head1[u] = tot1;
} void addedge(int u,int v,int w){
e[++tot2].from = u;
e[tot2].to = v;
e[tot2].val = w;
e[tot2].next = head2[u];
head2[u] = tot2;
} void spfa(int s,int flag){
queue<int> q;
for(int i=;i<=n;i++) dis[flag][i] = 1e9;
memset(vis,false,sizeof(vis));
q.push(s);
dis[flag][s] = ; vis[s] = true;
while(!q.empty()){
int cur = q.front();
q.pop(); vis[cur] = false;
for(int i=head1[cur];i;i=edge[i].next){
int v = edge[i].to;
if(dis[flag][v] > dis[flag][cur] + edge[i].val){
dis[flag][v] = dis[flag][cur] + edge[i].val;
if(vis[v] == ){
q.push(v);
vis[v] = true;
}
}
}
}
} inline void topo(){
queue<int> que;
que.push(x);
while(!que.empty()){
int cur = que.front();
que.pop();
for(int i=head2[cur];i;i=e[i].next){
int v = e[i].to , w = e[i].val;
--ind[v];
if(!ind[v]) {
que.push(v);
f[v] = max(f[v] , f[cur] + e[i].tag * w);
}
}
}
} void rebuild(){
for(int i=;i<=tot1;i++){
int v = edge[i].to , u = edge[i].from , w = edge[i].val;
if(dis[][u] + w + dis[][v] == dis[][y]){
addedge(u , v , w);
if(dis[][u] + w + dis[][v] == dis[][yy] || dis[][v] + w + dis[][u] == dis[][yy])
//为了处理无向图的问题
e[tot2].tag = ;
ind[v]++;
}
}
} int main(){
n = read(); m = read();
x = read(); y = read(); xx = read(); yy = read();
for(int i=;i<=m;i++){
u = read(); v = read(); w = read();
add(u , v , w);
add(v , u , w);
}
spfa(x , );
spfa(y , );
spfa(xx , );
spfa(yy , );
rebuild();
topo();
printf("%d\n",f[y]);
return ;
}
洛谷P2149 Elaxia的路线的更多相关文章
- 洛谷2149 Elaxia的路线(dp+最短路)
QwQ好久没更新博客了,颓废了好久啊,来补一点东西 题目大意 给定两个点对,求两对点间最短路的最长公共路径. 其中\(n,m\le 10^5\) 比较简单吧 就是跑四遍最短路,然后把最短路上的边拿出来 ...
- P2149 Elaxia的路线
P2149 Elaxia的路线 题意简述: 在一个n(n<=1500)个点的无向图里找两对点之间的最短路径的最长重合部分,即在保证最短路的情况下两条路径的最长重合长度(最短路不为一) 思路: 两 ...
- 洛谷 P4478 [BJWC2018]上学路线
洛谷 P4478 [BJWC2018]上学路线 原题 神仙题orz,竟然没有1A....容斥+卢卡斯+crt?? 首先用容斥做,记\(f[i][0/1]\)表示到i号点经过了奇数/偶数个点的方案数,因 ...
- 洛谷 P2149 [SDOI2009]Elaxia的路线 解题报告
P2149 [SDOI2009]Elaxia的路线 题目描述 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. Elaxia ...
- 洛谷——P2149 [SDOI2009]Elaxia的路线
P2149 [SDOI2009]Elaxia的路线 题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w每 ...
- 【模板】矩阵快速幂 洛谷P2233 [HNOI2002]公交车路线
P2233 [HNOI2002]公交车路线 题目背景 在长沙城新建的环城公路上一共有8个公交站,分别为A.B.C.D.E.F.G.H.公共汽车只能够在相邻的两个公交站之间运行,因此你从某一个公交站到另 ...
- Java实现 洛谷 Car的旅行路线
输入输出样例 输入样例#1: 1 3 10 1 3 1 1 1 3 3 1 30 2 5 7 4 5 2 1 8 6 8 8 11 6 3 输出样例#1: 47.5 import java.util. ...
- 洛谷 P2149 [SDOI2009]Elaxia的路线
题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的 ...
- 洛谷—— P2149 [SDOI2009]Elaxia的路线
https://www.luogu.org/problem/show?pid=2149 题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两 ...
随机推荐
- Android中Selector的用法(改变ListView和Button的默认背景)
Android中的Selector的用法 http://blog.csdn.net/shakespeare001/article/details/7788400#comments Android中的S ...
- fzyzojP2984 -- 序列变换问题
一个区间缩小变换的问题,并且n<=300 启示我们区间dp 我们考虑最后一定是在原串上扣一些,剩一些 所以不妨前求出[l,r]把[l,r]完全处理成什么样子的方案数 然后再来一遍序列dp,统计答 ...
- bug3 乱码问题
出现乱码问题是因为各软件之间的编码方式不同导致 1.tomcat修改编码方法: 2.myeclipse中修改编码方式的方法: window----preference ----general----- ...
- numpy/arrayobject.h”: No such file or directory
import numpyimport pyximportpyximport.install(setup_args={"script_args":["--compiler= ...
- python---基础知识回顾(六)网络编程2(处理粘包)
前戏: 之前在python---基础知识回顾(六)网络编程异步模块中提到过粘包现象,而且在使用twisted中提到过一种处理办法,按行接收lineReceived,当收到\r\n换行符时,才去缓冲区中 ...
- html基础知识汇总(二)之Emmet语法
div.imageBox+div.infoBox+input[type="button" class="starBtn"]*3 <div class=&q ...
- VIM各种快捷应用
vim +n filename 打开文件,光标直接跳转到第n行 w 移动光标到下一个单词的词首, b 移动光标到上一个单词的词首 e 移动光标到下一个单词的结尾, ge 移动光标到上 ...
- bzoj千题计划126:bzoj1038: [ZJOI2008]瞭望塔
http://www.lydsy.com/JudgeOnline/problem.php?id=1038 本题可以使用三分法 将点按横坐标排好序后 对于任意相邻两个点连成的线段,瞭望塔的高度 是单峰函 ...
- Golang入门教程(一)GOPATH与工作空间(Windows)
https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.2.md Windows 环境: 下面我就 ...
- 基本控件文档-UISwitch属性
CHENYILONG Blog 基本控件文档-UISwitch属性 Fullscreen UISwitch属性 技术博客http://www.cnblogs.com/ChenYilong/ 新 ...