题目

题解

这道题是 \(NOIP\;\;2017\) 的原题 ,让我见识到了什么是真正的 \(dfs\)

考场上想出来要状压了,\(n\) 那么小,肯定是压 \(n\) 那一位,然后层第转移,但是想了半天,一堆细节没搞懂,拿了个暴力分跑了。

后来看了题解才知道这竟然可以 \(dfs\) 搜索,虽然说剪支很恶心,但是那 \(70\) 短小的暴力太爽了

对于此题,由于我们更新某一条边不仅和终点有关,也和起点有关,所以我们在枚举终点时也要枚举它是有哪个点转移而来的

\(70\) 分 \(CODE:\)

Code
#include<bits/stdc++.h>
#define ri register int
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
inline int read() {
ri x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=gc();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
return x*f;
}
}
using IO::read;
namespace nanfeng{
#define cmax(x,y) ((x)>(y)?(x):(y))
#define cmin(x,y) ((x)>(y)?(y):(x))
#define FI FILE *IN
#define FO FILE *OUT
static const int N=14,INF=1e9+7;
int G[N][N],visn[N],n,m,ans=INT_MAX,tmp;
void dfs(int x) {
if (x==n) {ans=cmin(ans,tmp);return;}
if (tmp>ans) return;//小小的优化
for (ri i(1);i<=n;p(i)) {//要更新i
if (visn[i]) continue;
for (ri j(1);j<=n;p(j)) {//从j转移而来
if (!visn[j]||G[j][i]>INF||i==j) continue;
tmp+=visn[j]*G[j][i];visn[i]=visn[j]+1;
dfs(x+1);
tmp-=visn[j]*G[j][i];visn[i]=0;//回溯
}
}
}
inline int main() {
// FI=freopen("nanfeng.in","r",stdin);
// FO=freopen("nanfeng.out","w",stdout);
n=read(),m=read();
memset(G,127,sizeof(G));//初值要赋成最大
for (ri i(1);i<=m;p(i)) {
int u=read(),v=read(),w=read();
G[u][v]=G[v][u]=cmin(G[u][v],w);
}
for (ri i(1);i<=n;p(i)) visn[i]=1,dfs(1),visn[i]=0;//记得根也要回溯
printf("%d\n",ans);
return 0;
}
}
int main() {return nanfeng::main();}

这就是 $70$ 分代码,那么往下想,$dfs$ 最大优化手段是什么:剪枝。

好了我们考虑剪枝

首先我们最容易想到的就是最优性剪枝,就像是一个估价函数,很好想

然后我们发现,每一个点它至少需要扩展一条边,所以我们可以对每个点的所有的出边进行由小到大排序

且题目中说了“两个已经被挖掘过的宝藏屋之间的道路无需再开发”,所以我们可以放心大胆得把每一种情况更新,不用考虑什么后效性

\(AC\kern 0.5emCODE:\)

Code
#include<bits/stdc++.h>
#define ri register int
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
inline int read() {
ri x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=gc();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
return x*f;
}
}
using IO::read;
namespace nanfeng{
#define cmax(x,y) ((x)>(y)?(x):(y))
#define cmin(x,y) ((x)>(y)?(y):(x))
#define FI FILE *IN
#define FO FILE *OUT
#undef bool
static const int N=14,INF=1e9+7;
int G[N][N],visn[N],d[N],out[N][N],viso[N],tot,cnt,n,m,ans=INT_MAX,tmp,p;
inline bool cmp(int x,int y) {return G[p][x]<G[p][y];}
void dfs(int num,int x) {
for (ri i(num);i<=cnt;p(i)) {
if (tot+tmp*visn[viso[i]]>=ans) return;//如果答案直接小于估价值,直接此方案不合法
for (ri j(x);j<=d[viso[i]];p(j)) {//要从我们的最优开始搜
if (visn[out[viso[i]][j]]) continue;//搜过的点不搜
viso[p(cnt)]=out[viso[i]][j];
tmp-=G[viso[cnt]][out[viso[cnt]][1]];
tot+=visn[viso[i]]*G[viso[i]][viso[cnt]];
visn[viso[cnt]]=visn[viso[i]]+1;
dfs(i,j+1);//我们要从j+1继续搜,因为前面的已经搜过了
tmp+=G[viso[cnt]][out[viso[cnt]][1]];
tot-=visn[viso[i]]*G[viso[i]][viso[cnt]];
visn[viso[cnt--]]=0;//回溯
}
x=1;//x要初始为一,因为更换初始点时,他的出边也要从一开始
}
if (cnt==n) {ans=cmin(ans,tot);return;}
}
inline int main() {
// FI=freopen("nanfeng.in","r",stdin);
// FO=freopen("nanfeng.out","w",stdout);
n=read(),m=read();
memset(G,127,sizeof(G));
for (ri i(1);i<=m;p(i)) {
int u=read(),v=read(),w=read();
if (G[u][v]<w) continue;
if (G[u][v]>INF) out[out[u][p(d[u])]=v][p(d[v])]=u;//只有一条边第一次输入时才能加上
G[u][v]=G[v][u]=w;
}
for (ri i(1);i<=n;p(i)) {
p=i;
sort(out[i]+1,out[i]+d[i]+1,cmp);//排序
tmp+=G[i][out[i][1]];
}
for (ri i(1);i<=n;p(i)) {
tot=0;//估价值
viso[cnt=visn[i]=1]=i;//记录一下选的点
tmp-=G[i][out[i][1]];//把根节点的最有性减去
visn[i]=1;
dfs(1,1);
visn[i]=0;
tmp+=G[i][out[i][1]];//回溯
}
printf("%d\n",ans);
return 0;
}
}
int main() {return nanfeng::main();}

复杂度 \(\mathcal O(n!/\text{玄学})\)

NOIP 模拟 6 宝藏的更多相关文章

  1. 2014-10-31 NOIP模拟赛

        10.30 NOIp  模拟赛   时间 空间 测试点 评测方式 挖掘机(dig.*) 1s 256M 10 传统 黑红树(brtree.*) 2s 256M 10 传统 藏宝图(treas. ...

  2. HZOJ 20190818 NOIP模拟24题解

    T1 字符串: 裸的卡特兰数题,考拉学长讲过的原题,就是bzoj3907网格那题,而且这题更简单,连高精都不用 结论$C_{n+m}^{n}-C_{n+m}^{n+1}$ 考场上10min切掉 #in ...

  3. noip模拟6(T2更新

    由于蒟弱目前还没调出T1和T2,所以先写T3和T4.(T1T2更完辣! update in 6.12 07:19 T3 大佬 题目描述: 他发现katarina大佬真是太强了,于是就学习了一下kata ...

  4. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  5. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  6. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  7. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  8. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  9. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

随机推荐

  1. 小程序textarea设置maxlength后不是你想的那样简单

    可能很多小伙伴们.看见这个标题后; 觉得作者是一个标题党. textarea设置maxlength后, 限制用户输入的字符呗! 还能怎么样呢? 恭喜你,说对了一半. 之前我也一直是这样想的. 知道今天 ...

  2. 关于scrollview的无限滚动效果实现

    起因及需求:做过阅读器的朋友应该知道,一般的阅读器都会有仿真.平移等特效.最近赶上真空期,项目不忙,有点时间,于是想抓起来,总结点干货. 仿真翻页及平滑翻页的基本实现: 仿真翻页,使用系统自带的UIP ...

  3. postgresql安装及配置

    目录 1. 安装 2. PostgrepSQL的简单配置 2.1 修改监听的ip和端口 2.2 修改数据库log相关的参数 2.3 内存参数 3. 数据库的基础操作 3.1 连接数据库控制台 3.2 ...

  4. python使用笔记24--面向对象编程2

    类方法 类里面自带的方法,不用实例化就可以调用,想象,模型上自带的功能 类方法是公共的,在实例方法里面可以随意调用 但是在类方法里不能调用实例方法,不能使用实例变量,但是他可以调用其他的类方法 1 @ ...

  5. kali之Metasploit入门

    前言 不得不说Metasploit 目前是世界领先的黑客框架.它在某种程度上被几乎每个黑客/渗透者使用.因此,如果您想进入网络安全/渗透测试行业并有所成就,您就必须要需要熟悉它. Metasploit ...

  6. 微信小程序组件学习 -- 注册页面

    微信小程序组件使用手册地址: 1. 百度搜索"微信公众平台",扫码登录之后,点击帮助文档里面的普通小程序. 2. 接着选择"开发"-->"组件& ...

  7. Scrapy入门到放弃03:理解settings配置,监控Scrapy引擎

    前言 代码未动,配置先行.本篇文章主要讲述一下Scrapy中的配置文件settings.py的参数含义,以及如何去获取一个爬虫程序的运行性能指标. 这篇文章无聊的一匹,没有代码,都是配置化的东西,但是 ...

  8. 深入刨析tomcat 之---第9篇 how tomcat works 第9章,Session的实现 关于request.setContext(context)

    writedby 张艳涛,在学第9章session的时候,做了个实验在给的demo代码中添加了 package com.zyt.tomcat.ex09.core; public class Simpl ...

  9. 基于STC51单片机的霓虹灯

    基于STC51单片机的霓虹灯 设计要求: 使用PWM驱动8个LED灯 人眼不能观察到灯光全灭 灯光要有动画效果 设计概述: ​  按照设计要求,为了更直观的说明脉冲宽度调制技术(PWM),所以霓虹灯的 ...

  10. 云平台制作(1)-OPC Client取数模块的制作

    近来由于工程需要,基于OPC DA 2.0搭建通用的取数模块,与远程webscoket服务端连接,并传输数据.在网上找了些资料,修改相应网友公开的源代码,基本达到要求,特供大家参考. 1.实体类 us ...