MX-S

太简单了,没啥难度。\yiw

$ 1, 3, 5, 7, 9 $ 的二叉搜索树棵数是卡特兰数。

P6029

题意

给定一张有 $ n $ 个点,$ m $ 条边的图。可以任意交换途中两条边的权值不超过 $ K $ 次,问最后 $ 1 $ 到 $ n $ 的最短路径长度。

$ 1 \le n \le 50 \(,\) 1 \le m \le 150 \(,\) 1 \le K \le 20 $

Solution

这题是某次初赛模拟的时候放上来,似乎比较水,就写了一下。

不难想到一种贪心:直接将所有的最小边能换到路径上就换。

但是这样不一定是最优的,所以考虑枚举最后在路径上的边为所有边中前 $ i $ 小的。

并且用 Dp 在 Dijkstra 的同时计算。

设 $ f_{u, j, k} $ 表示从 $ 1 $ 到 $ u $ 的路径上有 $ j $ 条为前 $ i $ 小的边,且使用了 $ k $ 次交换魔法的最短路径长度。

设当前点为 $ u $,下一个节点为 $ v $,则转移方程如下:

  • 当 $ k + 1 \le K $ 时,$ f_{u, j, k} $ 可以更新 $ f_{v, j, k + 1} $。
  • 当遍历到的 $ (u, v) $ 这条边属于前 $ i $ 条边时,则将这条边边权设为 $ 0 $,并且设 $ j1 = j + 1 $,否则为 $ j $(因为前 $ i $ 条边在最后统一计算前缀和)。此时当 $ j1 \le m $ 时,则可以用 $ f_{u, j, k} + w $ 更新 $ f_{v, j1, k} $。

最后统计答案时,就枚举前 $ i $ 条最小边和 $ j, k $,再处理一个 $ sum $ 表示前 $ i $ 小的边权前缀和,然后在所有 $ f_{n, j, k} + sum $ 中取最小值即可,但是要注意的是枚举条件 $ j + k \le i $。

//Asahina Mafuyu
#include <bits/stdc++.h> using namespace std; const int N = 55, M = 155, K = 25; struct two_plus_four
{
int id, v, w;
};
struct three_plus_three
{
int u, j, k, f;
bool operator < (const three_plus_three & W) const
{
return f > W.f;
}
}; int n, m, k;
int w[M], id[M], mp[M];
int f[N][M][K];
bool st[N][M][K];
vector<two_plus_four> gph[N]; bool cmp(int a, int b)
{
return w[a] < w[b];
} void dijkstra(int limit)
{
memset(f, 0x3f, sizeof f);
memset(st, 0, sizeof st);
priority_queue<three_plus_three> q;
q.push({1, 0, 0, 0});
f[1][0][0] = 0;
while (q.size())
{
auto t = q.top(); q.pop();
int u = t.u, j = t.j, K = t.k;
if (st[u][j][K]) continue;
st[u][j][K] = 1; for (auto x : gph[u])
{
int v = x.v, w_ = x.w, id_ = x.id, j1 = j;
if (K < k && f[v][j][K + 1] > f[u][j][K])
{
f[v][j][K + 1] = f[u][j][K];
q.push({v, j, K + 1, f[v][j][K + 1]});
}
if (mp[id_] <= limit) j1 ++ , w_ = 0;
if (j1 <= m && f[v][j1][K] > f[u][j][K] + w_)
{
f[v][j1][K] = f[u][j][K] + w_;
q.push({v, j1, K, f[v][j1][K]});
}
}
}
} int main()
{
cin >> n >> m >> k;
for (int i = 1; i <= m; i ++ )
{
int a, b, c;
cin >> a >> b >> c;
gph[a].push_back({i, b, c}), gph[b].push_back({i, a, c});
id[i] = i, w[i] = c;
} sort(id + 1, id + m + 1, cmp);
sort(w + 1, w + m + 1);
for (int i = 1; i <= m; i ++ ) mp[id[i]] = i;
int s = 0, res = 0x3f3f3f3f;
for (int i = 0; i <= m; i ++ )
{
s += w[i];
dijkstra(i);
for (int j = 0; j <= i; j ++ )
for (int K = 0; K <= k && j + K <= i; K ++ )
res = min(res, f[n][j][K] + s);
} cout << res << '\n'; return 0;
}

2024.09.18初赛模拟MX-S/P6029记录的更多相关文章

  1. "2016-10-06T12:09:18.303+0800"

    Java public static void main(String[] args) throws ParseException { SimpleDateFormat sdf = new Simpl ...

  2. [转]如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误

    本文转自:http://www.cnblogs.com/yyangblog/archive/2011/01/07/1929657.html 问题概述: 在导入一个app后提示如下错误: “Error ...

  3. 2018.08.18 NOIP模拟 game(数位dp)

    Game 题目背景 SOURCE:NOIP2015-SHY4 题目描述 Alice 和 Bob 正在玩一个游戏,两个人从 1 轮流开始报数,如果遇到 7 的倍数或者遇到的这个数的十进制表示中含 7 , ...

  4. 软件工程项目组Z.XML会议记录 2013/09/18

    软件工程项目组Z.XML会议记录 [例会时间]2013年9月18日周三21:00-23:00 [例会形式]小组讨论 [例会地点]三号公寓楼会客厅 [例会主持]李孟 [会议记录]毛宇 会议整体流程 一. ...

  5. 7.18 NOI模拟赛 树论 线段树 树链剖分 树的直径的中心 SG函数 换根

    LINK:树论 不愧是我认识的出题人 出的题就是牛掰 == 他好像不认识我 考试的时候 只会写42 还有两个subtask写挂了 拿了37 确实两个subtask合起来只有5分的好成绩 父亲能转移到自 ...

  6. 7.18 NOI模拟赛 因懒无名 线段树分治 线段树维护直径

    LINK:因懒无名 20分显然有\(n\cdot q\)的暴力. 还有20分 每次只询问一种颜色的直径不过带修改. 容易想到利用线段树维护直径就可以解决了. 当然也可以进行线段树分治 每种颜色存一下直 ...

  7. 修改MS SQL忽略大小写 分类: SQL Server 数据库 2015-06-19 09:18 34人阅读 评论(0) 收藏

    第一步:数据库->属性->选项->限制访问:SINGLE_USER 第二步:ALTER DATABASE [数据库名称] collate Chinese_PRC_CI_AI 第三步: ...

  8. 10.18 noip模拟试题

    分火腿 (hdogs.pas/.c/.cpp) 时间限制:1s:内存限制 64MB 题目描述: 小月言要过四岁生日了,她的妈妈为她准备了n根火腿,她想将这些火腿均分给m位小朋友,所以她可能需要切火腿. ...

  9. 【.NetRemoting-3】2015.09.18

    [Remoting程序的基本实现] [一]服务程序集 [1]服务对象必须要求继承[MBR,MarshalByRefObject] [二]服务端应用程序 [1]注册通道 [两种类型的通道] [A]发送请 ...

  10. 虚拟机时间同步14 Aug 04:09:18 ntpdate[2941]: no server suitable for synchronization found

    因为虚拟机经常挂起,所以需要时间同步 [root@slave1 /root]$ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime cp: over ...

随机推荐

  1. 使用forEach循环异步方法,导致使用深拷贝时,得不到最新数据,控制台会打印出最新的数据

    在使用forEach循环遍历一个数组,如果循环时有异步方法,会导致最终深拷贝得不到最新数据,但是控制台会打印最新的数据 `const arr = [ { name: "Jone", ...

  2. oeasy教您玩转vim - 58 - # 块可视化

    ​ 块可视化编辑 回忆上节课内容 上次我们了解到行可视模式 行可视模式 V 也可配合各种motion o切换首尾 选区的开头和结尾是mark标记 开头是 '< 结尾是 '> 可以在选区内进 ...

  3. C# LINQ之IEqualityComparer<>接口应用

    在C#语言中,对集合的条件查询.分组统计等操作使用LINQ非常方便,LINQ的语法格式与SQL非常相似和便捷,而LINQ扩展方法配合Lambda更为简洁,如All.Any.Count.Max等Enum ...

  4. odoo 通过Javascript显示或隐藏form自带按钮

    实践环境 Odoo 14.0-20221212 (Community Edition) 需求描述 如下,根据条件对form视图自带按钮的显示.隐藏进行控制 代码实现 隐藏.显示编辑和创建按钮为例 od ...

  5. 【转载】Win10系统, administrator账户被微软账户强行绑定,怎么破?

    首先 声明:这是转载,我只是做一个记录,以下内容可解决问题(本人已尝试并已解决),当然也可以去转载出处查看大佬的原回答: Win10系统, administrator账户被微软账户强行绑定,怎么破? ...

  6. 我的编程经历,从天桥地摊Basic到西藏阿里的.Net AOT。(一,从井到Sharp)

    撇清一层歧义:标题中的阿里不是指阿里巴巴集团,喜马拉雅也不是指那个做音频频道的公司,文中所及内容以及我本人都与他们没有任何关联.依照地理正式名称:阿里指的是西藏西部阿里地区,喜马拉雅指的是青藏高原地球 ...

  7. 【C3】03 如何构建

    既然你已经了解了什么是CSS,以及使用CSS的基础知识,是时候更深入的了解该语言本身的结构了. 我们已经见过了本页讨论的很多概念:如果在之后对某些概念感到困惑的话,可以返回至此进行回顾. 前置知识 在 ...

  8. 从.net开发做到云原生运维(四)——.net core的微服务开发

    1. .net 6.0项目模板变更 在.net 5和.net 3.1的时候,asp.net core项目模板里有个Program类和Startup类,在.net 6中引入了一个最小api的项目模板,在 ...

  9. 【转载】网络协议之:sctp流控制传输协议

    原文地址: https://www.cnblogs.com/flydean/p/16277006.html ============================================== ...

  10. sublime 快速生成html基础代码

    一.快速生成HTML5的头部信息的步骤: 1.Ctrl + N,新建一个文档: 2.Ctrl + Shift + P,打开命令模式,再输入 sshtml 进行模糊匹配,将语法切换到html模式: 3. ...