P8906 [USACO22DEC] Breakdown P 题解

news/2024/9/25 18:25:16

P8906 [USACO22DEC] Breakdown P 题解

显然的套路是删边转化为加边。

考虑到维护整条路径不好维护,于是考虑转化维护 \(f_{i,k},g_{i,k}\) 分别表示 \(1,n\)\(i\) 走了 \(k\) 步时的最短路。那么此时 \(k\le 4\)

我们先考虑 \(f\) 的转移,\(g\) 的转移是等价的。

那么对于 \((x,y)\),若当前 \(1\)\(y\) 的最短距离是 \(p\),那么转移的时候相当于从点 \(y\)\(k-p\) 步。显然 \(p\le 3\),那么这样的转移大概一次是 \(O(n^3)\) 的,然而我们一次更新能接受的复杂度是 \(O(n)\),于是无法接受。

容易一些的,我们首先考虑 \(p=2\) 的情形。考虑到最终会得到更新的也只有 \(n\) 个点,那么我们直接枚举这 \(n\) 个点 \(a\)。这时候我们需要知道从 \(y\)\(a\) 恰好走 \(2\) 步的最短路 \(d_{y,a}\)。那这个东西由于限制了只走 \(2\) 步,是可以在更新每一条边的时候顺带预处理的。于是我们解决了 \(p=2\)

对于 \(p=3\),不难发现现在更新一次的复杂度是 \(O(n^2)\),但是考虑到 \(p=3\) 时当且仅当 \(x=1\),也就是说只有 $n $ 个这样的更新,于是这样的复杂度还是 \(O(n^3)\) 的,可以通过。

其实这道题的核心是想到如何处理 \(p\le 3\) 时的情形。观察到距离为 \(2\) 可以做预处理时这题基本就做完了。

代码:

#include <bits/stdc++.h>
#define N 303
#define K 10
#define int long long
using namespace std;
int n, k;
int w[N][N];
struct node {int x, y;
} e[N * N];
int mp[N][N];
int f[N][K]; 
int g[N][K]; 
int d[N][N];
void cm(int &x, int y) {x = min(x, y);
}
int add(int x, int y) {int ans = 1e18 + 1;for (int ck = 0; ck <= 4; ck++)for (int a = 1; a <= n; a++)ans = min(ans, f[a][ck] + g[a][k - ck]);mp[x][y] = 1;for (int a = 1; a <= n; a++)if (mp[y][a])cm(d[x][a], w[x][y] + w[y][a]);for (int a = 1; a <= n; a++)if (mp[a][x])cm(d[a][y], w[a][x] + w[x][y]);for (int ck = 0; ck < 4; ck++)cm(f[y][ck + 1], f[x][ck] + w[x][y]);for (int ck = 0; ck < 4; ck++) {for (int a = 1; a <= n; a++)if (mp[y][a])cm(f[a][ck + 1], f[y][ck] + w[y][a]);for (int a = 1; a <= n; a++)cm(f[a][ck + 2], f[y][ck] + d[y][a]);} if (x == 1) {for (int a = 1; a <= n; a++)for (int b = 1; b <= n; b++)if (mp[a][b])cm(f[b][4], f[a][3] + w[a][b]);} for (int ck = 0; ck < 4; ck++)cm(g[x][ck + 1], g[y][ck] + w[x][y]);for (int ck = 0; ck < 4; ck++) {for (int a = 1; a <= n; a++)if (mp[a][x])cm(g[a][ck + 1], g[x][ck] + w[a][x]);for (int a = 1; a <= n; a++)cm(g[a][ck + 2], g[x][ck] + d[a][x]);} if (y == n) {for (int a = 1; a <= n; a++)for (int b = 1; b <= n; b++)if (mp[b][a])cm(g[b][4], g[a][3] + w[b][a]);}return ans >= 1e18 ? -1 : ans;
}
stack<int>q;
signed main() {memset(f, 0x3f, sizeof f); memset(g, 0x3f, sizeof g); memset(d, 0x3f, sizeof d); cin >> n >> k;f[1][0] = g[n][0] = 0;for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)scanf("%lld",  &w[i][j]);for (int i = 1; i <= n * n; i++) scanf("%lld%lld", &e[i].x, &e[i].y);for (int i = n * n; i; i--) q.push(add(e[i].x, e[i].y));while (q.size())cout << q.top() << "\n", q.pop();return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

结对项目-四则运算

github链接这个作业属于哪个课程 班级的链接这个作业要求在哪里 作业要求的链接这个作业的目标 实现四则运算自动生成程序,结对协作开发姓名 学号柳浩 3122004444洪吉潮PSP表格PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)Planning 计划 20 25Esti…

java作业

要求做几道练习题,体会java一些比较细的知识点 1. • 第一行输出false是因为这行代码比较两个枚举变量s和t是否引用同一对象。s被赋值为Size.SMALL,而t被赋值为Size.LARGE。由于它们引用不同的枚举实例,所以输出为false。 • 第二行输出false是因为这行代码首先通过s.getCla…

基于Sentinel自研组件的系统限流、降级、负载保护最佳实践探索

一、Sentinel简介 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: •丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、…

信息学奥赛复赛复习03-CSP-J2019-03-纪念品-背包、01背包、完全背包

PDF文档公众号回复关键字:202409251 2019 CSP-J 题目3 纪念品 [题目描述] 小伟突然获得一种超能力,他知道未来 T天 N 种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量 每天,小伟可以进行以下两种交易无限次:任…

《DNK210使用指南 -CanMV版 V1.0》第二十六章 摄像头图像捕获实验

第二十六章 摄像头图像捕获实验 1)实验平台:正点原子DNK210开发板 2)章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k…

实时网络的仿真和配置工具RTaW Pegase v4.6版本更新

01概述随着嵌入式系统日益复杂,高效可靠的设计工具变得愈发重要。RTaW公司的仿真工具RTaW-Pegase最新发布的4.6版本,为用户带来了一系列重要更新和功能增强。本文将详细介绍RTaW-Pegase v4.6版本的主要更新内容,涵盖了DDS、SOME/IP、Ethernet、CAN以及SDV等多个关键领域的改…

CTFSHOW pwn03 WrriteUp

本文来自一个初学CTF的小白,如有任何问题请大佬们指教! 题目来源 CTFShow pwn - pwn03 (ret2libc) https://ctf.show/challenges 思路 1.下载题目放到checksec先查一下2.IDA打开题目Shift + F12查看字符串发现没有system和/bin/sh,但是有libc文件。 3.用gdb的cyclic查询一…

如何正确的在项目中接入微信JS-SDK

微信JS-SDK的功能 如果你点进来,那么我相信你应该知道微信的JS-SDK可以用来做什么了。微信的官方文档描述如下。微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系…