果真是宝藏题目。

0x01 前置芝士

这道题我是真没往状压dp上去想。题目来源

大概看了一下结构。盲猜直接模拟退火!\xyx

所需知识点:模拟退火,贪心。

0x02 分析

题目大意:给你一个图,可能有重边,可能有环。让你在这个图上构出一棵树,使得其权值和最小,每条边的权值定义为:这条边的长度 \(\times\) 这条边的两个端点中深度小的那一个的深度。输出这个最小权值和。

于是我们尝试去构造一个序列 \(a\),然后按照这个序列去构树。

按照这个序列构出的树保证第 \(a[i]\) 个结点一定与第 \(a[j], j \in [1, i - 1]\) 个结点相连。

接下来我们贪心考虑。我们需要使每个点都被拓展到,且权值最小,又因为序列规定,我们需要在已经拓展到的结点去拓展当前结点,那么一定选到当前结点权值最小的已被拓展过的结点进行拓展最优。

即,如果该树满足 \(len(a[i], a[j]) \times dep(a[j]) = \mathrm{Min}\{len(a[i], a[k]) \times dep(a[k]), k \in [1, i - 1]\}\),其中 \(len(x, y)\) 表示结点 \(x\) 到 \(y\) 边的长度,\(dep(x)\) 表示结点 \(x\) 的深度。则此时我们按照这个方式构出的树一定为当前序列下权值和最小的树。

于是题目转换为找到使得构成的树权值和最小的序列,并得到这个序列对应的最小权值和。

这样就是裸的模拟退火了。我们以序列 \(A,A_i = i\) 为初始序列,不断扰动,找到最小值。

调一下参数,可过。

srand: 998244353,SA: 7,delta of temperature: 0.996,initial temperature: 1e4,Target temperature: 0.1

0x03 具体实现

#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std; typedef long long LL;
int Max(int x, int y) {return x > y ? x : y;}
int Min(int x, int y) {return x < y ? x : y;}
int Abs(int x) {return x < 0 ? -x : x;}
void Swap(int &x, int &y) {int t = x; x = y; y = t;} int read() {
int k = 1, x = 0;
char s = getchar();
while (s < '0' || s > '9') {
if (s == '-')
k = -1;
s = getchar();
}
while (s >= '0' && s <= '9') {
x = (x << 3) + (x << 1) + s - '0';
s = getchar();
}
return x * k;
} void write(int x) {
if(x < 0) {
putchar('-');
x = -x;
}
if(x > 9)
write(x / 10);
putchar(x % 10 + '0');
} void print(int x, char s) {
write(x);
putchar(s);
} const int MAXN = 15;
const int INF = 0x3f3f3f3f;
const double q = 0.996;
int mp[MAXN][MAXN], n;
int a[MAXN], new_a[MAXN], dep[MAXN]; int f() {
dep[new_a[1]] = 1;
int res = 0;
for(int i = 2; i <= n; i++) {
int tmp = INF;
for(int j = 1; j < i; j++)
if(mp[new_a[j]][new_a[i]] != INF && mp[new_a[j]][new_a[i]] * dep[new_a[j]] < tmp) {
tmp = mp[new_a[j]][new_a[i]] * dep[new_a[j]];
dep[new_a[i]] = dep[new_a[j]] + 1;
}
if(tmp == INF)
return INF;
res += tmp;
}
return res;
} void Accept(int now, int &ans) {
for(int i = 1; i <= n; i++)
a[i] = new_a[i];
ans = now;
} int SA() {
for(int i = 1; i <= n; i++)
a[i] = i;
int ans = 0x7f7f7f7f;
double t = 1e4;
while(t > 0.1) {
for(int i = 1; i <= n; i++)
new_a[i] = a[i];
Swap(new_a[rand() % n + 1], new_a[rand() % n + 1]);
int now = f(), delta = now - ans;
if(delta < 0)
Accept(now, ans);
else if(exp(-delta / t) * RAND_MAX >= rand())
Accept(now, ans);
t *= q;
}
return ans;
} int main() {
srand(998244353);
memset(mp, 0x3f, sizeof mp);
n = read();
int m = read();
for(int i = 1; i <= m; i++) {
int u = read(), v = read(), w = read();
mp[u][v] = Min(mp[u][v], w);
mp[v][u] = Min(mp[v][u], w);
}
int ans = INF;
for(int i = 1; i <= 7; i++)
ans = Min(ans, SA());
print(ans, '\n');
return 0;
}

Solution -「Luogu 3959」 宝藏的更多相关文章

  1. Solution -「Luogu 5170」类欧几里得算法

    推柿子大赛了属于是. 题目要求三个柿子,不妨分别记为: \[\begin {align} f (a, b, c, n) &= \sum \limits _{i = 0} ^{n} \lfloo ...

  2. Solution -「Luogu 4135」作诗

    写在前面 & 前置芝士   好像是好久没有打理 blog 了.感觉上学期是有点颓.嘶,初三了好好冲一次吧.   那么回到这道题目.你会分块就能看懂. 题目大意   先挂个来自洛谷的 link. ...

  3. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  4. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  5. Solution -「BZOJ 3812」主旋律

    \(\mathcal{Description}\)   Link.   给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...

  6. Solution -「CF 1342E」Placing Rooks

    \(\mathcal{Description}\)   Link.   在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...

  7. 「 Luogu P1231 」 教辅的组成

    题目大意 有 $\text{N1}$ 本书 $\text{N2}$本练习册 $\text{N3}$本答案,一本书只能和一本练习册和一本答案配对.给你一些书和练习册,书和答案的可能的配对关系.问你最多可 ...

  8. 「Luogu 1525」关押罪犯

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description \(S\)城现有两座监狱,一共关押着\(N\)名罪犯,编号分别为\(1 - N\) ...

  9. 「Luogu 2367」语文成绩

    更好的阅读体验 Portal Portal1: Luogu Description 语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行.她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少 ...

随机推荐

  1. 《计算机组成原理/CSAPP》网课总结(一)

    现在是2022年4月17日晚10点,本月计划的网课<csapp讲解>视频课看到了第八章"异常"第三讲,视频讲的很好但更新很慢,暂时没有最新的讲解,所以先做一个简单总结. ...

  2. keepalived安装及配置文件详解

    一个执着于技术的公众号 在上一篇文章中,我们对Keepalived进行了简单入门学习: Keepalived入门学习 今天我们继续学习Keepalived服务. 一.安装Keepalived服务 两种 ...

  3. MySQL双主双从配置

    双主双从结构图 Master1配置 server-id=1 #开启binlog日志 log-bin=mysql-bin #忽略的库 binlog-ignore-db=mysql #复制的库 binlo ...

  4. 【面试普通人VS高手系列】Spring中事务的传播行为有哪些?

    一个工作了2年的粉丝,私信了一个比较简单的问题. 说: "Spring中事务的传播行为有哪些?" 他说他能记得一些,但是在项目中基本上不需要配置,所以一下就忘记了. 结果导致面试被 ...

  5. Spring Cloud Alibaba入门篇

    学习条件 了解web三层架构 熟练应用SSM架构 了解Maven管理工具的使用 熟练使用SpringBoot,以及了解SpringBoot基本原理. 了解部分术语:应用.工具.耦合.负载等 温馨提示: ...

  6. Spring Boot+微信小程序_保存微信登录者的个人信息

    1. 前言 微信小程序开发平台,提供有一类 API,可以让开发者获取到微信登录用户的个人数据.这类 API 统称为开放接口. Tip:微信小程序开发平台,会把微信登录用户的个人信息分为明文数据和敏感数 ...

  7. wcf使用JetEntityFrameworkProvider.dll写access数据库时,报"操作必须使用一个可更新的查询"错误的解决办法

    由于users用户组无权重写access数据库,需要设置users组用户能读写access数据库.

  8. Spring Boot整合模板引擎jsp

    jsp也算是一种模板引擎吧.整合jsp前,先说一下运行SpringBoot项目的几种方式 1. 运行SpringBoot项目的几种方式 1.1 使用内嵌Tomcat运行项目 在IDE中右键运行启动类, ...

  9. Spring是如何整合JUnit的?JUnit源码关联延伸阅读

    上一篇我们回答了之前在梳理流程时遇到的一些问题,并思考了为什么要这么设计. 本篇是<如何高效阅读源码>专题的第十二篇,通过项目之间的联系来进行扩展阅读,通过项目与项目之间的联系更好的理解项 ...

  10. 探究MySQL中SQL查询的成本

    成本 什么是成本,即SQL进行查询的花费的时间成本,包含IO成本和CPU成本. IO成本:即将数据页从硬盘中读取到内存中的读取时间成本.通常1页就是1.0的成本. CPU成本:即是读取和检测是否满足条 ...