Solution -「Luogu 3959」 宝藏
果真是宝藏题目。
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」 宝藏的更多相关文章
- Solution -「Luogu 5170」类欧几里得算法
推柿子大赛了属于是. 题目要求三个柿子,不妨分别记为: \[\begin {align} f (a, b, c, n) &= \sum \limits _{i = 0} ^{n} \lfloo ...
- Solution -「Luogu 4135」作诗
写在前面 & 前置芝士 好像是好久没有打理 blog 了.感觉上学期是有点颓.嘶,初三了好好冲一次吧. 那么回到这道题目.你会分块就能看懂. 题目大意 先挂个来自洛谷的 link. ...
- Solution -「ARC 104E」Random LIS
\(\mathcal{Description}\) Link. 给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
- Solution -「BZOJ 3812」主旋律
\(\mathcal{Description}\) Link. 给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
- 「 Luogu P1231 」 教辅的组成
题目大意 有 $\text{N1}$ 本书 $\text{N2}$本练习册 $\text{N3}$本答案,一本书只能和一本练习册和一本答案配对.给你一些书和练习册,书和答案的可能的配对关系.问你最多可 ...
- 「Luogu 1525」关押罪犯
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description \(S\)城现有两座监狱,一共关押着\(N\)名罪犯,编号分别为\(1 - N\) ...
- 「Luogu 2367」语文成绩
更好的阅读体验 Portal Portal1: Luogu Description 语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行.她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少 ...
随机推荐
- [题解][ARC089D] ColoringBalls
题目大意 有 \(n\) 个白色的小球排成一排,有一个长为 \(k\) 的字符串 \(S\).接下来进行 \(k\) 次操作. 第 \(i\) 个操作,选择一段连续的小球(可以为空),若 \(S\) ...
- Java多线程—线程同步(单信号量互斥)
JDK中Thread.State类的几种状态 线程的生命周期 线程的安全问题(同步与互斥) 方法一:同步代码块 多个线程的同步监视器(锁)必须的是同一把,任何一个类的对象都可以 syn ...
- Java安全之SnakeYaml反序列化分析
Java安全之SnakeYaml反序列化分析 目录 Java安全之SnakeYaml反序列化分析 写在前面 SnakeYaml简介 SnakeYaml序列化与反序列化 常用方法 序列化 反序列化 Sn ...
- 老生常谈系列之Aop--JDK动态代理的底层实现原理
老生常谈系列之Aop--JDK动态代理的底层实现原理 前言 在Aop系列里面有两篇文章,分别是老生常谈系列之Aop--Spring Aop原理浅析和老生常谈系列之Aop--Spring Aop源码解析 ...
- 重新审视C# Span<T>数据结构
先谈一下我对Span的看法, span是指向任意连续内存空间的类型安全.内存安全的视图. Span和Memory都是包装了可以在pipeline上使用的结构化数据的内存缓冲器,他们被设计用于在pipe ...
- 5分钟了解二叉树之AVL树
转载请注明出处:https://www.cnblogs.com/morningli/p/16033733.html AVL树是带有平衡条件的二叉查找树,其每个节点的左子树和右子树的高度最多相差1.为了 ...
- 论文解读(GMIM)《Deep Graph Clustering via Mutual Information Maximization and Mixture Model》
论文信息 论文标题:Deep Graph Clustering via Mutual Information Maximization and Mixture Model论文作者:Maedeh Ahm ...
- 浅谈BSGS和EXBSGS
我的 BSGS 和各位犇犇的差不多,但是不需要求逆元 Luogu [ TJOI2007 ] 可爱的质数 原题展现 题目描述 给定一个质数 \(p\),以及一个整数 \(b\),一个整数 \(n\),现 ...
- liunx 服务器下面安装mysql8.0
闲来无事,准备自己搭建一个服务器高点事情,不可避免的就是需要使用到mysql数据库了.在Linux系统安装MySQL8.0,网上已经有很多的教程了,到自己安装的时候却发现各种各样的问题,现在把安装过程 ...
- 我的第一篇随笔-Test
用于测试 中文字符 English character