传送门(最短路树+可并堆)

Description

有一张n个点m条边的无向图,求删去任意一条边后,从S到T的最短距离的最大值

n, m ≤ 2×1052 \times 10^52×105

Solution

这道题是[USACO09JAN]Safe Travel的变形,然后这是题解

Safe Travel这道题的普遍做法是并查集树剖,但学长的PDF里提到的是题解讲的可并堆做法,所以我就没采用前两种

然后讲回传送门这题,
首先考虑怎么求删掉一条边后相邻两个点到 T 的最短距离。建出最短路树,如果删掉的不是连向父亲的边,则最短路不变,否则就和Safe Travel一样了

那么怎么求出最终答案呢?可以在图上DP一下

对每个点 u,记 d(u) 表示 u 到 T 的最短路,e(u) 表示删掉它和最短路树上父亲的边后的最短路。令 dp(u) 表示 S = u 时的答案。每次找到 dp 值最小的点来更新其它的点的 dp 值即可。用 u 更新 v 时的转移为 dp(v) =min { max(dp(u) + w(u, v), u == parent v?e(v) : d(v)) }。

Code

//一定不能把S,T反过来,不然就全WA了 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<ll,int> pr;
const int inf=0x7fffffff;
const int N=2e5+5;
const int M=2e5+5;
struct Edge{int v,w,nxt,tr;
}edge[M<<1];
int head[N],cnt,vis[N],pre[N];ll dis[N];
priority_queue<pr,vector<pr> ,greater<pr> > q;
int siz[N],dfn[N],ind,parent[N];ll e[N],dp[N];
struct Node{int to,ls,rs,fa,dist;ll val;
}t[M*20];
int tot,rt[N];
int n,m;
void add_edge(int u,int v,int w){edge[++cnt].v=v;edge[cnt].w=w;edge[cnt].nxt=head[u];head[u]=cnt;
}
void dijskra(int s){for(int i=1;i<=n;i++) dis[i]=inf;memset(vis,0,sizeof(vis));dis[s]=0;q.push(make_pair(0,s));while(!q.empty()){pr tmp=q.top();q.pop();int u=tmp.second;if(vis[u]) continue;vis[u]=1;for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].v,w=edge[i].w;if(dis[v]>dis[u]+1ll*w){dis[v]=dis[u]+1ll*w;pre[v]=i;q.push(pr(dis[v],v));}}}
}
void build(){//建最短路树 for(int i=1;i<=n;i++)if(pre[i]) edge[pre[i]].tr=1;
}
int merge(int a,int b){if(!a||!b) return a+b;if(t[a].val>t[b].val) swap(a,b);t[a].rs=merge(t[a].rs,b);t[t[a].rs].fa=a;if(t[t[a].ls].dist<t[t[a].rs].dist) swap(t[a].ls,t[a].rs);t[a].dist=t[t[a].rs].dist+1;return a;
}
int pop(int a){return merge(t[a].ls,t[a].rs);
}
bool check(int u,int v){return dfn[v]>=dfn[u]&&dfn[v]<=dfn[u]+siz[u]-1;
}
void dfs(int u,int fa){dfn[u]=++ind;siz[u]=1;for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].v;if(v==fa||!edge[i].tr) continue;parent[v]=u;dfs(v,u);rt[u]=merge(rt[u],rt[v]);siz[u]+=siz[v];}for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].v;if(v==fa||edge[i].tr) continue;//(u,fa)也是树边,不考虑 t[++tot]=(Node){v,0,0,tot,0,dis[u]+dis[v]+edge[i].w};rt[u]=merge(rt[u],tot); }while(check(u,t[rt[u]].to)) rt[u]=pop(rt[u]);e[u]=rt[u]?t[rt[u]].val-dis[u]:inf;
}
void get_ans(int s){for(int i=1;i<=n;i++) dp[i]=inf;memset(vis,0,sizeof(vis));dp[s]=0;q.push(make_pair(0,s));while(!q.empty()){pr tmp=q.top();q.pop();int u=tmp.second;if(vis[u]) continue;vis[u]=1;for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].v,w=edge[i].w;int t=max(dp[u]+w,parent[v]==u?e[v]:dis[v]);if(dp[v]>t){dp[v]=t;q.push(pr(dp[v],v));}}}
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);add_edge(u,v,w);add_edge(v,u,w);}dijskra(n);build();tot=n;dfs(n,0);get_ans(n);if(dp[1]==inf) printf("%d\n",-1); else printf("%lld\n",dp[1]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【DP】Mobile Service(jzoj 1327)

Mobile Service jzoj 1327 题目大意 某公司有三个员工&#xff0c;现在有n个时刻&#xff0c;某一时刻要一个员工到一个位置&#xff08;别的员工不能动&#xff09;&#xff0c;代价为ci,jc_{i,j}ci,j​&#xff0c;一个位置一个时刻最多有一个人&#xff0c;问最小代价是多…

用WinForm/WPF代码来为.NET Core 3.0功能投票

我们在5月报道过微软希望在.NET Core 3.0上运行WinForms和WPF。为了实现这个目标&#xff0c;他们正在构建一个新工具&#xff0c;该工具将允许你投票以决定他们需要把哪些API移植到.NET Core。但是&#xff0c;这不是一次直接进行的投票&#xff0c;而是基于你的应用程序正在使…

病毒扩散

链接&#xff1a; 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200429210705568.png?x-oss-processimage/waterm…

P3200-[HNOI2009]有趣的数列【卡特兰数】

正题 题目链接:https://www.luogu.com.cn/problem/P3200 题目大意 求一个长度为2∗n2*n2∗n的排列要求 奇数位和偶数位分别递增相邻的偶数位大于奇数位 解题思路 可以看做是一个2∗n2*n2∗n的序列按顺序填进奇数和偶数位&#xff0c;然后因为第二个要求所以奇数位在任何时候…

【SPFA】Party(jzoj 1328)

Party jzoj 1328 题目大意 有一个有向图&#xff0c;给你一个x&#xff0c;让你求每一个点到x再回去的最短路径&#xff0c;输出所有最短路径的最大值 输入样例 4 8 2 1 2 4 1 3 2 1 4 7 2 1 1 2 3 5 3 1 2 3 4 4 4 2 3输出样例 10 样例解释 数据范围 1⩽x⩽N⩽10001\le…

【每日一题】4月27日题目精讲 Removal

链接&#xff1a; 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 524288K&#xff0c;其他语言1048576K 64bit IO Format: %lld题目描述 Bobo has a sequence of integers s1, s2, …, sn where 1 ≤ si ≤ k. Find out the number of distinc…

[CF966E] May Holidays(树上数据结构问题、分块+虚树)

Description 一个 n 个结点的有根树&#xff0c;每个结点 x 有一个值 txt_xtx​&#xff0c;和一个颜色 (黑/白)。 m 次操作&#xff1a; 翻转某点颜色。询问有多少点 x 满足&#xff1a;x 为黑色&#xff0c;x 的白色后代数 > tx。 n, m ≤ 10510^5105 Solution 令 wi …

Asp.Net Core 2.2.0-preview1已经发布

原文地址 ASP.NET Core 2.2.0-preview1 now available今天我们很高兴地宣布,现在可以试用ASP.NET Core和.NET Core的下一个次要版本的第一个预览。在过去的几个月里&#xff0c;我们和社区里的许多人一起为这个版本进行开发&#xff0c;现在它已经准备好让更广泛的受众尝试它并…

YbtOJ#20089-[NOIP2020模拟赛B组Day10]平衡的树【贪心】

正题 题目链接:https://www.ybtoj.com.cn/contest/70/problem/3 题目大意 一棵树nnn个节点&#xff0c;每条边(x,y,a,b)(x,y,a,b)(x,y,a,b)&#xff0c;可以花费111的代价让一条边的a,ba,ba,b都减去111&#xff0c;但是不能小于000&#xff0c;要求最少代价使得每条边满足yyy…

纪中B组模拟赛总结(2020.2.13)

成绩 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4141414lyflyflyf200200200100100100000000100100100 总结 今天真改“滚”QAQ T1一开始不会&#xff0c;最后才来做&#xff0c;发现了题目的精髓&#xff0c;才切掉 T2打了个ST表&#xff0c;MLE&#x…

牛客网【每日一题】4月28日题目精讲 美味菜肴

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 小明是个大厨&#xff0c;早上起来他开始一天的工作。他所在的餐厅每天早上都会买好n件食材&#xff08;每种…

UOJ284 快乐游戏鸡(树上动态规划问题、长链剖分+单调栈)

Description 一棵 n 个点的有根树&#xff0c;带点权 wi。 从 s 出发&#xff0c;希望达到 t&#xff0c;每秒可以从当前点移动到某一个儿子。 有一个死亡次数&#xff0c;初始为 0。若在某个点 i(i ! s, t) 时&#xff0c;死亡次数 ≤ wi&#xff0c;那么死亡次数自增 1&…

C#系列之聊聊.Net Core的InMemoryCache

这两天在看.net core的in memory cache&#xff0c;这里记录一下用法&#xff0c;主要涉及MemoryCache的Get&#xff0f;Set&#xff0f;Expire&#xff0f;Flush。首先我们先用dotnet命令创建一个mvc的项目&#xff0c;这里我们将使用postman来请求server&#xff0c;1dotnet …

P1412-经营与开发【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P1412 题目大意 nnn个地点&#xff0c;有一个能力值为www的稿子 如果地点iii是资源型的&#xff0c;那么可以选择获得ai∗wa_i*wai​∗w的价值&#xff0c;且ww∗(1−k100)ww*(1-\frac{k}{100})ww∗(1−100k​)如果地点iii是…

纪中在家培训总结(2020.2.1~2020.2.24)

前言 因为新型冠状病毒&#xff08;疫情情况&#xff09;的原因&#xff0c;纪中培训改为在家培训&#xff0c;一天的进度变成了两天甚至三天的进度QAQ&#xff0c;但我还是想说&#xff1a;武汉加油&#xff01;中国加油&#xff01; 这次培训总结没啥好写&#xff0c;请勿嘲…

CF1137F Matches Are Not a Child‘s Play(树上数据结构问题、树链剖分+ODT)

Description 一棵 n 个点的树&#xff0c;点权最初为 1 ∼ n 的排列。 定义一个删点过程&#xff1a;每次找到权值最小的叶子&#xff0c;删去它以及连接的边&#xff0c;重复这个过程直到剩下一个点&#xff0c;然后删去最后的点。 处理 q 个询问&#xff1a; 将一个点 x 的…

小石的签到题

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 输入描述: 共一行&#xff0c;输入一个数 n 。 输出描述: 共一行&#xff0c;输出 “Shi” 或 “Yang”&…

值类型、引用类型和泛型的前世今生

值类型、引用类型和泛型多语言咱们先不说主题&#xff0c;先说说CLR支持多语言。 .net有个非常强大的特点&#xff0c;那就是跨语言&#xff0c;支持很多语言&#xff0c;比如C#、J#等。先来个图看一看C# J# VB 等等等

P3247-[HNOI2016]最小公倍数【分块,并查集】

正题 题目链接:https://www.luogu.com.cn/problem/P3247 题目大意 nnn个点mmm条边&#xff0c;每条边有(x,y,a,b)(x,y,a,b)(x,y,a,b)。qqq次询问(x′,y′,a′,b′)(x,y,a,b)(x′,y′,a′,b′)表示询问是否存在一条x′−>y′x->yx′−>y′的路径使得路径上amaxa′,bma…

【DP】奖励卡(jzoj 3937)

奖励卡 jzoj 3937 题目大意 现在有一场比赛&#xff0c;想观看的人要提交申请&#xff0c;现在有x个人提交后得到两个号&#xff0c;y个人提交后得到一个号&#xff0c;有n轮抽号&#xff0c;每一轮抽一个号&#xff08;概率相等&#xff09;&#xff0c;这个号的所有者不参…