【USACO09JAN】安全出行Safe Travel(最短路树+并查集优化)

该博客介绍了一种利用最短路树和并查集优化解决USACO竞赛中的安全出行问题。当源点到每个点的最短路径唯一时,可以通过选择非树边来寻找次短路径。通过计算固定值并使用并查集跟踪已修改的点,避免了暴力遍历,从而提高了算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

萌新冒泡

首先有个套路 只要题目中说了源点到每个点最短路径是唯一的 那往往都和最短路树有关系

题意是求不能经过最后一条边的次短路 要使得这条路最短 显然要尽量的多走最短路径上的路 

假设现在要求1->x 我们考虑走了一段最短路径后如何跳到x点

设当前点为u 选择与u点相连的一条非树边(这条边连向x的子树内的某点v) 然后ans[x]=dis[u]+w(u,v)+(dis[v]-dis[x])

然后我们就可以暴力枚举每条非树边暴力更新啦!

仔细观察发现 对于每条非树边 dis[u]+w(u,v)+dis[v]是个定值

wow 那把这个值算出来 排个序 似乎还是要扫一遍?不过如果强烈安利并查集——可以维护哪些点已经被修改过了,因为被修改过的点肯定是连续的

然后好像卡SPFA是出题人的基本素养

#include<bits/stdc++.h>
const int N=100005;
const int M=200005;
const int INF=0x3f3f3f3f;
using namespace std;
int n,m;
struct Edge
{
	int from,to,next,val;
}edge[2*M];
int first[N],tot;
inline void addedge(int x,int y,int z)
{
	tot++;
	edge[tot].from=x; edge[tot].to=y; edge[tot].next=first[x]; edge[tot].val=z; first[x]=tot;
}
typedef pair<int,int> Pair;
priority_queue<Pair,vector<Pair>,greater<Pair> >
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值