题意
小 P 最近遇上了大麻烦,他的高等代数挂科了。于是他只好找高代老师求情。善良的高代老师答应不挂他,但是要求小 P 帮助他一起解决一个难题。
问题是这样的,高代老师近期要组织班上同学一起去漂流,漂流可以看做是在一张 n 个点 m 条边的有向无环图上进行的,点编号从 0 到 n-1 ,表示景点; 边是连接各景点的一定长度的河道。同时,定义编号为 s 是起点而 t 是终点。我们不妨把从 s 点到 t 点不论走什么样的路径都需要经过的边称为桥, 这些桥由于地势险要所以是危险的。现在高代老师有两条长度为 l 的安全绳,他希望用这两条安全绳覆盖尽可能长的桥,使得他们通过的桥的长度之和尽量短。
,n<=100000, m<=200000,0<=s,t,si,ti
分析
首先把桥求出来。这里可以用到支配树算法,具体可以看这篇文章。
然后只要随便dp一下就好了。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
typedef long long LL;
const int N=100005;
const LL inf=(LL)1e15;
int n,m,last[N],ls[N],cnt,rd[N],size[N],a1,a[N],s,t,tos[N],dep[N],fa[N][17];
LL bri[N],dis[N],f[N][3],d[N],L;
struct edge{
int to,next;LL w;}e[N*4];
queue<int> que;
stack<int> sta;
bool pro[N],arr[N];
int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){
if(ch=='-')f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=ge