●洛谷P2934 [USACO09JAN]安全出行Safe Travel
题链:
https://www.luogu.org/problemnew/show/P2934
题解:
最短路(树),可并堆(左偏堆),并查集。
个人感觉很好的一个题。
由于题目已经明确说明:从1点到每个点的最短路有且只有一条。
那么跑完最短路后,就可以得到一个最短路树,即每个点只有一个来源点。
然后来考虑,如果某一个u点无法从其最短路树上的father到达时,是个怎样的情况:

由于u无法从其父亲到达,所以如果还存在1到u的路径的话,
应该在其子树内(包括u),存在一个v点,与子树外的某个节点x通过一条x和v之间的非树边,
形成这样一个从1到u的新最短路:1 → x → v → u,
特别的,不能出现x是u的父亲且v就是u点的情况。(因为那条边已经被玩坏了2333)
那么这样的话,新的1到u的距离就是$dis[x]+e[x→v]+dis[v]-dis[u]$。
令$W(x,v)=dis[x]+e[x→v]+dis[v]$
因为要新的距离最小,所以就应该找到一对合法的(x,v)使得$W(x,v)$最小。
那么为什么答案就一定这种形式1 → x → v → u的呢?
为何不能是1 → x → y → v → u,或者经过更多的子树外的节点呢?

(图中的虚线表示最短路树上的路径)
如果经过了两个子树外的节点,那么距离d1就是:
$d1=dis[x]+e1+e2+dis[v]-dis[u]$
如果只经过了一个子树外的节点,比如是y,那么距离d2就是:
$d2=dis[y]+e2+dis[v]-dis[u]$
如果d2>d1的话,即按照之前的疑问,如果经过两个子树外节点会使得答案比经过一个子树外节点优,
那么:
$d2-d1>0$
$dis[y]+e2+dis[v]-dis[u]-(dis[x]+e1+e2+dis[v]-dis[u])>0$
$dis[y]-dis[x]-e1>0$
$dis[y]>dis[x]+e1$,与dis[y]是1到y的最短路矛盾,所以最优答案一定是只经过一个子树外节点。
(经过更多的子树外节点的情况可以自己试着证明一下。)
那么现在就需要对每个节点u,维护出对其合法的最小的W(x,v),那么答案ANS[u]=W(x,v)-dis[u]。
而这个W(x,v)的维护就直接使用小根堆即可完成,
为了保证时间复杂度,我们需要从树下往上依次处理每个点的答案,
会涉及到把u节点的众多儿子v的堆合并,所以要用到可并堆(本人使用的是左偏堆)。
同时合并后,可能有些在堆里的W(x,v)就不合法了,因为有的x,v处在了同一个子树内,
但是不需要直接在堆里去删除,只用维护一个并查集,在取堆顶时判断该W(x,v)是否合法即可。
代码:
#include<bits/stdc++.h>
#define MAXN 100050
using namespace std;
int N,M;
int pre[MAXN],dis[MAXN],ANS[MAXN],order[MAXN];
struct Info{
int x,y,w;
bool operator < (const Info &rtm) const{
return w<rtm.w;
}
};
struct Edge{
int ent;
int to[MAXN*4],nxt[MAXN*4],val[MAXN*4],head[MAXN];
Edge(){ent=2;}
void Adde(int u,int v,int w){
to[ent]=v; val[ent]=w;
nxt[ent]=head[u]; head[u]=ent++;
}
}E;
struct UFSet{
int fa[MAXN];
void Reset(int n){
for(int i=1;i<=n;i++) fa[i]=i;
}
int Findfa(int u){
if(u==fa[u]) return u;
else return fa[u]=Findfa(fa[u]);
}
void Union(int x,int y){
static int fx,fy;
fx=Findfa(x); fy=Findfa(y);
if(fx==fy) return; fa[fx]=fy;
}
bool Insame(int x,int y){
return Findfa(x)==Findfa(y);
}
}S;
struct LT{
//Define the LEN of the leaf is 1.
int dnt;
Info d[MAXN*4];
int root[MAXN],ls[MAXN*4],rs[MAXN*4],len[MAXN*4];
int Merge(int u,int v){
if(!u||!v) return u+v;
if(d[v]<d[u]) swap(u,v);
rs[u]=Merge(rs[u],v);
if(len[ls[u]]<len[rs[u]]) swap(ls[u],rs[u]);
len[u]=len[rs[u]]+1;
return u;
}
void Insert(int u,Info now){//Insert a new node into the heap of u
++dnt; d[dnt]=now,len[dnt]=1;//As a new node, it's a leaf.
root[u]=Merge(root[u],dnt);
}
int Pop(int u){
return Merge(ls[u],rs[u]);
}
Info Top(int u){
static Info ret;
while(ret=d[root[u]],ret.x&&S.Insame(ret.x,ret.y)){
// cout<<"Delete : "<<ret.x<<" < - > "<<ret.y<<" : "<<ret.w<<endl;
root[u]=Pop(root[u]);
}
return ret;
}
}H;
void Dijkstra(){
typedef pair<int,int>Pii; int ont=0;
priority_queue<Pii,vector<Pii>,greater<Pii> >Q;
memset(dis,0x3f,sizeof(dis));
Q.push(make_pair(dis[1]=0,1));
while(!Q.empty()){
Pii now=Q.top(); Q.pop();
int u=now.second;
if(now.first>dis[u]) continue;
order[++ont]=u;
for(int e=E.head[u];e;e=E.nxt[e]){
int v=E.to[e];
if(dis[v]<=dis[u]+E.val[e]) continue;
dis[v]=dis[u]+E.val[e]; pre[v]=u;
Q.push(make_pair(dis[v],v));
}
}
}
int main(){
scanf("%d%d",&N,&M);
for(int i=1,a,b,c;i<=M;i++)
scanf("%d%d%d",&a,&b,&c),
E.Adde(a,b,c),E.Adde(b,a,c);
Dijkstra(); S.Reset(N);
for(int i=N;i>=1;i--){
int u=order[i];
for(int e=E.head[u];e;e=E.nxt[e]){
int v=E.to[e];
if(v==pre[u]||S.Insame(u,v)) continue;
H.Insert(u,(Info){u,v,dis[u]+dis[v]+E.val[e]});
}
Info now=H.Top(u);
if(!now.x) ANS[u]=-1;
else ANS[u]=now.w-dis[u];
H.root[pre[u]]=H.Merge(H.root[pre[u]],H.root[u]);
S.Union(pre[u],u);
}
for(int i=2;i<=N;i++) printf("%d\n",ANS[i]);
return 0;
}
●洛谷P2934 [USACO09JAN]安全出行Safe Travel的更多相关文章
- 洛谷—— P2934 [USACO09JAN]安全出行Safe Travel || COGS ——279|| BZOJ——1576
https://www.luogu.org/problem/show?pid=2934 题目描述 Gremlins have infested the farm. These nasty, ugly ...
- luogu P2934 [USACO09JAN]安全出行Safe Travel
题目链接 luogu P2934 [USACO09JAN]安全出行Safe Travel 题解 对于不在最短路树上的边(x, y) 1 | | t / \ / \ x-----y 考虑这样一种形态的图 ...
- P2934 [USACO09JAN]安全出行Safe Travel
P2934 [USACO09JAN]安全出行Safe Travel https://www.luogu.org/problemnew/show/P2934 分析: 建出最短路树,然后考虑一条非树边u, ...
- [USACO09JAN]安全出行Safe Travel 最短路,并查集
题目描述 Gremlins have infested the farm. These nasty, ugly fairy-like creatures thwart the cows as each ...
- 「BZOJ1576」[Usaco2009 Jan] 安全路经Travel------------------------P2934 [USACO09JAN]安全出行Safe Travel
原题地址 题目描述 Gremlins have infested the farm. These nasty, ugly fairy-like creatures thwart the cows as ...
- [USACO09JAN]安全出行Safe Travel
题目 什么神仙题啊,我怎么只会\(dsu\)啊 我们考虑一个非常暴力的操作,我们利用\(dsu\ on \ tree\)把一棵子树内部的非树边都搞出来,用一个堆来存储 我们从堆顶开始暴力所有的边,如果 ...
- 洛谷——P2935 [USACO09JAN]最好的地方Best Spot
P2935 [USACO09JAN]最好的地方Best Spot 题目描述 Bessie, always wishing to optimize her life, has realized that ...
- 2018.07.06 洛谷P2936 [USACO09JAN]全流Total Flow(最大流)
P2936 [USACO09JAN]全流Total Flow 题目描述 Farmer John always wants his cows to have enough water and thus ...
- 洛谷 P2935 [USACO09JAN]最好的地方Best Spot
题目描述 Bessie, always wishing to optimize her life, has realized that she really enjoys visiting F (1 ...
随机推荐
- 20162323周楠《Java程序设计与数据结构》第六周总结
学号 2016-2017-2 <程序设计与数据结构>第六周学习总结 教材学习内容总结 继承:从已有类派生一个新类,是面向对象程序设计的一个特点 在Java中只支持单继承,不支持多继承 继承 ...
- Storm概念讲解和工作原理介绍
Strom的结构 Storm与传统关系型数据库 传统关系型数据库是先存后计算,而storm则是先算后存,甚至不存 传统关系型数据库很难部署实时计算,只能部署定时任务统计分析窗口数据 ...
- Scala 快速入门
 Scalable 编程语言 纯正的的面向对象语言 函数式编程语言 无缝的java互操作 scala之父 Martin Odersky 1. 函数式编程 函数式编程(functional progr ...
- raid5 阵列硬盘离线数据恢复成功案例
数据恢复故障描述: 某研究院 DELL 磁盘阵列崩溃,内置15块1TB硬盘搭建的RAID5阵列.一开始有一块硬盘离线,在更换新硬盘进行同步的过程中,第二块磁盘指示灯报警,同步失败,阵列无法正常工作. ...
- 业余草基于JAVA的模块化开发框架JarsLink
需求背景 应用拆分的多或少都有问题.多则维护成本高,每次发布一堆应用.少则拆分成本高,无用功能很难下线.故障不隔离.当一个系统由多人同时参与开发时,修改A功能,可能会影响B功能,引发故障.多分支开发引 ...
- 关于网页设计的css+html相对定位和决定定位的理解
css中有很多定位,其中最重要的是相对定位和绝对定位: 定位很重要,不搞好,网页就会很乱,显示的完全不是自己想要的效果,自己必须掌握: 首先说一个重要的结论:绝对定位,是不占位置的,总是相对离自己最近 ...
- java希尔排序
java希尔排序 1.基本思想: 希尔排序也成为"缩小增量排序",其基本原理是,现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插 ...
- MySQL中使用sql语句获得表结构
最近在研究PHP,那么就必须涉及到mysql.其中一个功能通过表数据自动生成页面,紧接着发现在一张空表中无法读取数据(因为人家刚刚新建,就是空的没有数据) 延伸出来便是直接查表结构获得字段名,再进行处 ...
- Linux CentOS7.0 (01)在Vmvare Workstation上 安装配置
一.新建虚拟机 1.创建新的虚拟机 -> 默认典型 ->选择安装介质 2.指定虚拟机名称.安装目录.磁盘容量大小 点击 "完成",创建虚拟机! 随后虚拟机将自动启动安装 ...
- spring-oauth-server实践:授权方式三:PASSWORD模式下 authorities:ROLE_{user.privillege}, ROLE_USER
一.数据库配置 1.oauth_client_details 2.user_ 3.user_privillege 二.password模式 授权过程 1.授权者granter和请求参数 Resourc ...