博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nssl1454-最短路【并查集,贪心】
阅读量:2022 次
发布时间:2019-04-28

本文共 1113 字,大约阅读时间需要 3 分钟。

正题


题目大意

n n n个点,每个点可以走到 [ a i , n ] [a_i,n] [ai,n],每个点可以从 [ b i , n ] [b_i,n] [bi,n]到达。

d i s i , j ∗ ( i + j ) dis_{i,j}*(i+j) disi,j(i+j)的异或和


解题思路

首先我们可以知道肯定是先往后跳再往前走最优,因为如果先往前再往后最优的话显然可以直接往后跳。

所以我们先计算往前走的步数,枚举一个终点,然后一层一层扩展即可

之后考虑往后走,我们可以用并查集来,从步数少的枚举到步数大的,然后用并查集进行往后扩展,之后不断更新最短距离


c o d e code code

#include
#include
#include
#include
using namespace std;const int N=6100; int n,a[N],b[N],dis[N][N],fa[N],ans;bool v[N];vector
q[N];int find(int x){
return (fa[x]==x)?x:(fa[x]=find(fa[x]));}int main(){
scanf("%d",&n); for(int i=2;i<=n;i++) scanf("%d",&a[i]); for(int i=2;i<=n;i++) scanf("%d",&b[i]); memset(dis,0x3f,sizeof(dis)); for(int i=1;i<=n;i++){
dis[i][i]=0; int j=i-1,k=b[i],w=1; while(j){
int z=k; for(;j>=z;j--){
dis[j][i]=w; k=min(k,b[j]); } w++; } } a[1]=1; for(int i=1;i<=n;i++){
for(int j=0;j<=n;j++){
q[j].clear(); fa[j]=j;v[j]=0; } for(int j=i;j<=n;j++) q[dis[i][j]].push_back(j); for(int j=0;j<=n;j++) for(int k=0;k
=a[q[j][k]];p=find(p)){ if(dis[i][q[j][k]]+1

转载地址:http://fdwaf.baihongyu.com/

你可能感兴趣的文章
编译和运行dubbo-admin管理平台
查看>>
图解分布式事务—两阶段提交协议
查看>>
生产环境数据库并发数的调整
查看>>
Eclipse中避免修改后台代码后手动install和重启
查看>>
Maven多模块项目加载
查看>>
单点登录SSO的原理及实现方式总结
查看>>
远程办公之:向日葵X 使用教程
查看>>
Xshell 和 Xftp 的使用,以及连接远程服务器教程(以阿里云云服务器为例)
查看>>
虚拟机中安装centos7系统并使用xshell进行连接访问
查看>>
[新手向] 使用 Thunderbird + Enigmail 发送加密邮件
查看>>
thunderbird 使用OpenPGP加解密邮件
查看>>
作为一个程序员需要了解多少网络方面的基础?网络基础总结
查看>>
使用Docker Hub和华为云容器镜像服务搭建高速网盘
查看>>
世界首富马斯克,底层有一套强大的思维方式
查看>>
学会这2招,读100本书只是小目标
查看>>
你可能不信,领先80%的人的方法其实很简单
查看>>
懂了!VMware/KVM/Docker原来是这么回事儿
查看>>
分不清ERP、SAP、MES?我来帮你搞定
查看>>
程序员如何把控自己的职业
查看>>
什么是工程师文化?
查看>>