解题思路

初识模拟退火,于是拿这道题练练手

我们指定没有连边的结点连了一条权值为inf的边,成为完全图,避免了不存在的生成树

这样枚举根,然后每一次枚举都跑若干遍模拟退火

初始状态就是一张菊花图,父亲都指向当前为根的结点

每次产生相近解只需要随机改变一个结点的父亲,但是这样并不能保证产生的关系任然是一棵树

考虑到最多只有12个结点,每次跑一遍并查集暴力判断,可以归结到常数复杂度

多试几个种子就过了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>int n,m,x,y,v;
long long M[20][20];
const long long inf=0x3f3f3f3f3f3f;
int Fa[20];namespace SA{const double start_T=10000;const double delta_T=0.993;const double low_T=1e-12;long long calc(int now,int fa,int dep){long long ret=dep*M[fa][now];for (int i=1;i<=n;i++){if (Fa[i]!=now||i==Fa[i]) continue;ret+=calc(i,now,dep+1);}return ret;}namespace MFS{int B[20];inline void init(){for (int i=1;i<=n;i++) B[i]=i;}inline int find(int k){return (k==B[k])?(k):(B[k]=find(B[k]));}void merge(int a,int b){int fa=find(a),fb=find(b);if (fa==fb) return;B[fa]=fb;}inline bool same(int a,int b){return find(a)==find(b);}}bool allowed(){MFS::init();for (int i=1;i<=n;i++){if (i!=Fa[i]&&MFS::same(i,Fa[i])) return false;MFS::merge(i,Fa[i]);}return true;}long long ans;inline double rand_double(){return rand()/(double)RAND_MAX;}long long SA_main(int root){ans=calc(root,0,0);double T=start_T;while (T>low_T){int change,to;do{change=rand()%n+1,to=rand()%n+1;}while (change==to||change==root);int ec=Fa[change];Fa[change]=to;if (!allowed()){Fa[change]=ec;continue;}long long nxt=calc(root,0,0);if (nxt<ans||exp((ans-nxt)/T)>rand_double()) ans=nxt;else Fa[change]=ec;T*=delta_T;}return ans;}
}long long Ans=inf;int main(){srand(/**/);//种子被和谐了scanf("%d%d",&n,&m);if (n==1){printf("%d\n",0);return 0;}memset(M,0x3f,sizeof(M));for (int i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&v);M[x][y]=M[y][x]=std::min(M[x][y],(long long)v);}for (int i=0;i<=n;i++)for (int j=0;j<=n;j++)M[i][j]=std::min(M[i][j],inf);for (int i=1;i<=n;i++){for (int j=1;j<=n;j++) Fa[j]=i;//初始状态菊花图Ans=std::min(Ans,SA::SA_main(i));Ans=std::min(Ans,SA::SA_main(i));Ans=std::min(Ans,SA::SA_main(i));Ans=std::min(Ans,SA::SA_main(i));Ans=std::min(Ans,SA::SA_main(i));Ans=std::min(Ans,SA::SA_main(i));Ans=std::min(Ans,SA::SA_main(i));Ans=std::min(Ans,SA::SA_main(i));Ans=std::min(Ans,SA::SA_main(i));Ans=std::min(Ans,SA::SA_main(i));//这里多做几次}printf("%lld\n",Ans);
}

转载于:https://www.cnblogs.com/ytxytx/p/9705768.html

[NOIp提高组2017]宝藏相关推荐

  1. NOIP 提高组 复赛 历年 试题

    NOIP 提高组  复赛  历年 试题 NOIP 2017 提高组 复赛  试题 https://wenku.baidu.com/view/70de9e29854769eae009581b6bd97f ...

  2. NOIP提高组1900~1909以及1986集合答案

    1900:[17NOIP提高组]时间复杂度时间限制: 1000 ms 内存限制: 262144 KB 提交数: 670 通过数: 287 [题目描述] 给出了他自己算出的时间复杂度,可他的编程老师实在 ...

  3. 2018.12.08【NOIP提高组】模拟B组总结(未完成)

    2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...

  4. 第一届『Citric杯』NOIP提高组模拟赛 题解

    [官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...

  5. 津津的储蓄计划 NOIp提高组2004

    这个题目当年困扰了我许久,现在来反思一下 本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津\ ...

  6. 信息学奥赛一本通(C++版)NOIP提高组(1820-1829)

    信息学奥赛一本通(C++版)NOIP提高组目录 //1820 [题目描述] 我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所 处位置的(值减1)为指数,以10为底数的幂之和的 ...

  7. {小结}2016.6.11【初中部 NOIP提高组 】模拟赛C

    2016.6.11[初中部 NOIP提高组 ]模拟赛C No.1!!! 100+33.3+10+90=233.3 23333 1298. 牛棚(graze2.pas/c/cpp) 题解 1299. 洗 ...

  8. 6271. 2019.8.4【NOIP提高组A】锻造 (forging)

    6271. 2019.8.4[NOIP提高组A]锻造 (forging)  (File IO): input:forging.in output:forging.out Time Limits: 15 ...

  9. 2020.08.08【NOIP提高组】模拟:奶牛的图片 总结

    2020.08.08[NOIP提高组]模拟:奶牛的图片 总结 Description Farmer John希望给他的 N ( 1 ≤ N ≤ 100 , 000 ) N(1\leq N\leq100 ...

最新文章

  1. Alpha多样性稀释曲线rarefraction curve还不会画吗?快看此文
  2. 钢铁侠机器人公仔_这个618,买个钢铁侠机器人和儿子一起回童年
  3. WordPress永久链接 静态化教程
  4. catia如何整列加工_CATIA V5 R20加工模块的自动编程方法
  5. java学习(135):map中泛型使用
  6. 递归(特别重要,小计算用)
  7. UNIX域套接字编程和socketpair 函数
  8. 部门管理系统_什么是实物资产管理系统?优势有哪些?
  9. 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)
  10. Java项目:医院门诊收费管理系统(java+html+jdbc+mysql)
  11. 《白帽子讲web安全》学习笔记——web安全概述
  12. 量子计算(六):量子计算软件介绍
  13. 你可以有喜欢和善用的语言,但千万不要和她Bind
  14. 十一假期,终于过上了理想的生活节奏
  15. FileUploadException: Stream closed
  16. 安卓linux开机画面,安卓开机画面_安卓开机动画修改_安卓开机动画修改器-Guide信息网...
  17. 移动端是如何做适配的?
  18. uni-app实战之社区交友APP(5)搜索和发布页开发
  19. 梦想照进现实|CSDN 实体奖牌 第六期
  20. 导出Excel时出现80080005错误的解决办法

热门文章

  1. Windows的Java_HOME环境变更配置
  2. 《Windows CE大排档》第一版勘误表
  3. 《LeetCode力扣练习》第55题 跳跃游戏 Java
  4. ArrayList转Json的2个坑
  5. OpenCvSharp_FindContours函数参数详解
  6. Oracle数据库安装响应文件,1.2.6 步骤6:配置应答文件,然后运行安装程序(2)...
  7. 高度不定垂直居中_经典:CSS垂直居中的七种方法
  8. hiv实验室抗体筛查流程图_HIV自测都有哪些方法?结果准确么?
  9. calico跨主机ping不通_戳穿 Calico 的谎言
  10. python读取大文件csv内存溢出_Python,内存错误,csv文件太大