题目描述
题解
-
首先证明一个结论:公共部分一定是连续的一段
因为如果公共部分分成了两段,可以将中间部分强行拼成一段。即一个人可以走另一个人在断开部分的路线,这样一定可以时答案变优。因此,公共部分一定是连续的一段。 -
step2:我们可以预处理A到B的最短路图和C到D的最短路图。
具体的实现方法时建立正图和反图分别以这四个点跑Dijkstra,枚举每一条边(x,y,v)看看是否满足: d i s 1 x + d i s 2 y + v = d i s 1 B / D dis1_x+dis2_y+v=dis1_{B/D} dis1x+dis2y+v=dis1B/D -
step3:我们发现这张最短路图就是一张DAG,因此我们只需要进行一遍拓扑排序求出最短路图的最长链即可=为最终的答案。
#include <bits/stdc++.h>
using namespace std;
const int N = 100000;
vector < pair<int,int> > G1[N], G2[N];
int n, m, A, B, C, D, tot = 0;
int vis