Luogu P3959 宝藏
这道题正解是状压DP,不过我不会所以写一下随机化算法来骗骗分。
听说当时考场上就有很多写prim然后挂掉的神仙,其实这道题是可以prim过的
prim是一种基于贪心的算法,在本题中由于盲目的选择当前最优解可能会使得后面的决策不优,于是我们请出基于随机化的prim我口胡的
每一次选择边的时候,有概率的跳过一些对于当前来说最优的边,这样为后面可能跑出更优的解做出铺垫。
这样一次可能得到的解还不如直接贪心得到的解优,但是我复杂度这么小,跑个几千次又怎样?
然后选好随机数种子,满怀信仰地祈祷就可以AC了
虽然这不是严格意义上的模拟退火,但是随机化的思想还是比较神仙的
CODE
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<ctime>
using namespace std;
const int N=15,M=1005;
int edge[N][N],n,m,x,y,z,dep[N],ans,INF;
bool vis[N];
struct data
{
int fr,to;
bool operator <(const data a) const { return dep[a.fr]*edge[a.fr][a.to]<dep[fr]*edge[fr][to]; }
}stack[M];
priority_queue <data> small;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline int Simulate_Anneal(int st)
{
memset(dep,0,sizeof(dep)); memset(vis,0,sizeof(vis));
register int i; int tot=0,top=0; memset(stack,0,sizeof(stack));
while (!small.empty()) small.pop(); dep[st]=vis[st]=1;
for (i=1;i<=n;++i) if (edge[st][i]<INF) small.push((data){st,i});
for (i=1;i<n;++i)
{
data e=small.top(); small.pop();
while (!small.empty()&&(vis[e.to]||!(rand()%n)))
{
if (!vis[e.to]) stack[++top]=e;
e=small.top(); small.pop();
}
vis[e.to]=1; dep[e.to]=dep[e.fr]+1; tot+=dep[e.fr]*edge[e.fr][e.to];
while (top) small.push(stack[top--]);
for (register int j=1;j<=n;++j)
if (!vis[j]&&edge[e.to][j]<INF) small.push((data){e.to,j});
}
return tot;
}
inline void miner(int &x,int y)
{
x=y<x?y:x;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i,t=200; read(n); read(m); srand(20030909);
memset(edge,63,sizeof(edge)); ans=INF=edge[0][0];
for (i=1;i<=m;++i)
{
read(x); read(y); read(z);
miner(edge[x][y],z); miner(edge[y][x],z);
}
while (t--)
for (i=1;i<=n;++i)
miner(ans,Simulate_Anneal(i));
return printf("%d",ans),0;
}
Luogu P3959 宝藏的更多相关文章
- [luogu]P3959 宝藏[NOIP][状态压缩DP]
[luogu]P3959 宝藏[TREASURE] 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的 ...
- [Luogu P3959] 宝藏 (状压DP+枚举子集)
题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...
- 【luogu P3959 宝藏】 题解
题目链接:https://www.luogu.org/problemnew/show/P3959 我只是心血来潮想学SA(考场上骗分总行吧). 这个题可以状压DP.爆搜+剪枝.有意思的还是随机化搜索( ...
- P3959 宝藏
P3959 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 nn 个深埋在地下的宝藏屋, 也给出了这 nn 个宝藏屋之间可供开发的 mm 条道路和它们的长度. 小明决心亲自前往挖掘 ...
- 洛谷 P3959 宝藏 解题报告
P3959 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 \(n\) 个深埋在地下的宝藏屋, 也给出了这 \(n\) 个宝藏屋之间可供开发的 \(m\) 条道路和它们的长度. 小 ...
- luogu P3959(2017noipTG D2T2
luogu P3959(2017noipTG D2T2 不知道为什么,这两天见了好多伪装成图的dp题,这道也是. 最短路只有40分,实际上可以从数据范围n<=12看出来是状压dp. soluti ...
- 【题解】P3959 宝藏 - 状压dp / dfs剪枝
P3959 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝 ...
- 题解 Luogu P3959 【宝藏】
来一篇不那么慢的状压??? 话说这题根本没有紫题难度吧,数据还那么水 我是不会告诉你我被hack了 一看数据规模,n≤12,果断状压. 然后起点要枚举,就设dp状态: f[i][j]=以i为起点到j状 ...
- Luogu P3959 [NOIP2017]宝藏
题目 STO rqy OTZ 首先这种题一看我们就知道可以爆搜. prim一眼假了,但是加个SA也能过. 所以我们来写状压. 记\(f_{i,j,S}\)表示起点到\(j\)距离为\(i\),我们现在 ...
随机推荐
- Android 裁剪人脸
人脸裁剪类 public final class FaceCj { private static BitmapFactory.Options BitmapFactoryOptionsbfo; priv ...
- (网页)angularjs中的interval定时执行功能(转)
转载博客园魔豆: 一个例子,用来显示当前实时时间,1秒钟刷新一次: <!DOCTYPE html> <html ng-app="myApp"> <he ...
- JavaScript大杂烩0 - WEB基础知识
1. 协议小结:HTTP协议与TCP/IP协议 现代Web应用开发的基础是HTTP协议,那么HTTP协议与我们熟知的TCP/IP协议有什么关系呢? 这个要从网络通信模型说起,简单的说,计算机通信就像两 ...
- g4e基础篇#1 为什么要使用版本控制系统
g4e 是 Git for Enterprise Developer的简写,这个系列文章会统一使用g4e作为标识,便于大家查看和搜索. 章节目录 前言 1. 基础篇: 为什么要使用版本控制系统 Git ...
- Spark程序数据结构优化
场景: 1.scala中的对象:对象头是16个字节(包含指向对象的指针等源数据信息),如果对象中只有一个int的属性,则会占用20个字节,也就是说对象的源数据占用了大部分的空间,所以在封装数据的时候尽 ...
- [20180627]truncate table的另类恢复.txt
[20180627]truncate table的另类恢复.txt --//前几天看链接http://www.xifenfei.com/2018/06/truncate-table-recovery. ...
- python中常用函数整理
1.map map是python内置的高阶函数,它接收一个函数和一个列表,函数依次作用在列表的每个元素上,返回一个可迭代map对象. class map(object): ""&q ...
- fedora 28 安装 wine 运行 uTorrent 解决linux 端,pt 资源下载问题
fedora 28 仓库中,资源比较多.使用 wine 运行windows 程序,可以一定程度上解决软件跨平台问题. 搜索: Last metadata expiration check: :: ag ...
- windows server服务器上mysql远程连接失败的坑
windows server服务器上mysql远程连接失败的坑 背景:趁这阿里云活动,和朋友合伙买了个服务器,最坑的是没想到他买的是windows Server的,反正便宜,将就着用吧,自己装好了wa ...
- 实战:阿里巴巴 DevOps 转型后的运维平台建设
导读:阿里巴巴DevOps转型之后,运维平台是如何建设的?阿里巴巴高级技术专家陈喻结合运维自身的理解,业务场景的分析和业界方法论的一些思考,得出来一些最佳实践分享给大家. 前言 “我是这个应用 ...