宝藏

题目链接

首先,打了一个prim,得了45分

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
#define N 15
#define M 2000
#define INF 0x3f3f3f3f
int n,m,dis[N],dep[N],ans;
int Head[N],tot;
bool vis[N];
struct NODE{
int to,w,next;
} e[M];
struct cmp{
bool operator()(int a,int b){
return dis[a]>dis[b];
}
};
priority_queue< int , vector<int> , cmp > q;
inline int read(){
int x=; char c=getchar();
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') { x=(x<<)+(x<<)+c-''; c=getchar(); }
return x;
}
inline void add(int x,int y,int w){
e[++tot].to=y;
e[tot].w=w;
e[tot].next=Head[x];
Head[x]=tot;
}
int prim(int St){
int sum=;
for(int i=;i<=n;i++){
dis[i]=;
dep[i]=; vis[i]=;
}
dis[St]=dep[St]=;
q.push(St);
while(!q.empty()){
int u=q.top(); q.pop();
if(vis[u]) continue;
vis[u]=; sum+=dis[u];
for(int i=Head[u];i;i=e[i].next){
int v=e[i].to;
if(dis[v]>(dep[u]+)*e[i].w){
dep[v]=dep[u]+;
dis[v]=dep[v]*e[i].w;
}
q.push(v);
}
}
return sum;
}
int main()
{
scanf("%d%d",&n,&m);
int x,y,w;
for(int i=;i<=m;i++){
x=read(); y=read(); w=read();
add(x,y,w); add(y,x,w);
}
ans=INF;
for(int i=;i<=n;i++)
ans=min(ans,prim(i));
printf("%d\n",ans);
return ;
}

然后看到题解里状压DP、模拟退火什么玩意的。。

模拟退火我是不会的

不过随机化什么的好像可以骗一下分

于是将代码改了一点

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<queue>
using namespace std;
#define N 15
#define M 2000
#define INF 0x3f3f3f3f
int n,m,dis[N],dep[N],ans;
int Head[N],tot;
bool vis[N];
struct NODE{
int to,w,next;
} e[M];
struct cmp{
bool operator()(int a,int b){
return dis[a]+rand()>dis[b]+rand();  //非常low的随机化
}
};
priority_queue< int , vector<int> , cmp > q;
inline int read(){
int x=; char c=getchar();
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') { x=(x<<)+(x<<)+c-''; c=getchar(); }
return x;
}
inline void add(int x,int y,int w){
e[++tot].to=y;
e[tot].w=w;
e[tot].next=Head[x];
Head[x]=tot;
}
int prim(int St){
int sum=;
for(int i=;i<=n;i++){
dis[i]=;
dep[i]=; vis[i]=;
}
dis[St]=dep[St]=;
q.push(St);
while(!q.empty()){
int u=q.top(); q.pop();
if(vis[u]) continue;
vis[u]=; sum+=dis[u];
for(int i=Head[u];i;i=e[i].next){
int v=e[i].to;
if(vis[v]) continue;
if(dis[v]>(dep[u]+)*e[i].w){
dep[v]=dep[u]+;
dis[v]=dep[v]*e[i].w;
}
q.push(v);
}
}
return sum;
}
int main()
{
srand();
scanf("%d%d",&n,&m);
int x,y,w;
for(int i=;i<=m;i++){
x=read(); y=read(); w=read();
add(x,y,w); add(y,x,w);
}
ans=INF;
int g=;
while(g--){
srand(rand());
for(int i=;i<=n;i++)
ans=min(ans,prim(i));
}
printf("%d\n",ans);
return ;
}

很迷的是上面代码的复杂度巨大

然后发现一个很严重的问题

邻接表就跟吔了shi一样

我们将邻接表改成邻接矩阵,

又改了一下随机化的方式

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<queue>
using namespace std;
const int MAXN=,MAXM=;
const int INF=0x3f3f3f3f;
int n,m,g[MAXN][MAXN];
int Head[MAXN],num;
struct NODE{
int pos,cost;
};
struct cmp{
bool operator ()(NODE a,NODE b){
return a.cost>b.cost;
}
};
priority_queue< NODE,vector<NODE>,cmp > que;
bool vis[MAXN];
NODE s[MAXM];
int cnt,dis[MAXN],tot[MAXN];
int prim(int S){
int ans=;
memset(vis,,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
que.push(NODE{S,});dis[S]=tot[S]=;
for(int i=;i<=n;i++){
cnt=;
while(!que.empty()&&(vis[que.top().pos]||rand()%(i+)<)){
if(!vis[que.top().pos])
s[++cnt]=que.top();
que.pop();
}
int k;
if(que.empty()) k=s[cnt].pos,cnt--;
else k=que.top().pos,que.pop();
vis[k]=;
ans+=dis[k];
if(ans>INF) return INF;
for(int i=;i<cnt;i++) que.push(s[i]);
for(int i=;i<=n;i++)
if(g[k][i]<INF){
if(dis[i]>(tot[k]+)*g[k][i]){
tot[i]=tot[k]+;
dis[i]=tot[i]*g[k][i];
}
que.push(NODE{i,dis[i]});
}
}
return ans;
}
int main()
{
memset(g,0x3f,sizeof(g));
scanf("%d%d",&n,&m);
int x,y,w;
for(int i=;i<=m;i++){
scanf("%d%d%d",&x,&y,&w);
if(w<g[x][y]) g[x][y]=g[y][x]=w;
}
int ans=INF;
int t=;
while(t--)
for(int i=;i<=n;i++)
ans=min(ans,prim(i));
printf("%d\n",ans);
return ;
}

以上做法都不大靠谱,大家还是状压DP吧(逃

【洛谷P3959】[NOIP2017] 宝藏的更多相关文章

  1. 洛谷P3959 [NOIP2017]宝藏

    [题目描述] 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋,也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但 ...

  2. 洛谷 P3959 NOIP2017 宝藏 —— 状压搜索

    题目:https://www.luogu.org/problemnew/show/P3959 搜索: 不是记忆化,而是剪枝: 邻接矩阵存边即可,因为显然没有那么多边. 代码如下: #include&l ...

  3. 洛谷$P3959\ [NOIp2017]$ 宝藏 状压$dp$

    正解:状压$dp$ 解题报告: 传送门$QwQ$ $8102$年的时候就想搞这题了,,,$9102$了$gql$终于开始做这题了$kk$ 发现有意义的状态只有当前选的点集和深度,所以设$f_{i,j} ...

  4. 【题解】洛谷P3959 [NOIP2017TG] 宝藏(状压DP+DFS)

    洛谷P3959:https://www.luogu.org/problemnew/show/P3959 前言 NOIP2017时还很弱(现在也很弱 看出来是DP 但是并不会状压DP 现在看来思路并不复 ...

  5. 【洛谷P3959】宝藏

    题目大意:比较复杂,点 这里 看题. 题解:对于状态压缩 dp 来讲,阶段的确立十分重要.本题中,采用以层次为阶段进行状压 dp. 设状态 \(f[i][S]\) 表示开凿到深度 \(i\),当前已经 ...

  6. NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp

    原文链接https://www.cnblogs.com/zhouzhendong/p/9261079.html 题目传送门 - 洛谷P3959 题目传送门 - Vijos P2032 题意 给定一个 ...

  7. 洛谷P3959 宝藏(NOIP2017)(状压DP,子集DP)

    洛谷题目传送门 Dalao的题解多数是什么模拟退火.DFS剪枝.\(O(3^nn^2)\)的状压DP之类.蒟蒻尝试着把状压改进了一下使复杂度降到\(O(3^nn)\). 考虑到每条边的贡献跟它所在的层 ...

  8. 洛谷P3959——宝藏

    传送门:QAQQAQ 题意: 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了$n$个深埋在地下的宝藏屋, 也给出了这$n$个宝藏屋之间可供开发的$m$条道路和它们的长度. 小明决心亲自前往挖掘所有 ...

  9. 洛谷 P3959 宝藏 解题报告

    P3959 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 \(n\) 个深埋在地下的宝藏屋, 也给出了这 \(n\) 个宝藏屋之间可供开发的 \(m\) 条道路和它们的长度. 小 ...

随机推荐

  1. 【ExtJS】关于constructor、initComponent、beforeRender

    ExtJS提供的组件非常丰富,不过当原生的组件无法满足要求时,就需要扩展原生自定义组件了. initComponent 和 constructor 就是Extjs 提供用来实现继承和扩展的方式. 在E ...

  2. TOJ 3488 Game Dice

    描述 In the game of Dungeons & Dragons, players often roll multi-sided dice to generate random num ...

  3. codeigniter读取数据库的公共配置并全局缓存的实现方案

    引言 学习CodeIgniter大概有几天了.从第一天了解后,对CI情有独钟,比较符合我的风格.其实一直以来对框架这块不太敏感.自己长时间的开发,也有一套自己的开发风格和习惯.但是这年头,你说你不会框 ...

  4. 20个最受欢迎的Linux命令(转)

    本文根据 commandlinefu 网站的历史排名,筛选出了前 20 个得票最高的 Linux 命令.看看你都能熟练使用了吗? 1.以 root 帐户执行上一条命令 sudo !! 2.利用 Pyt ...

  5. 从Linux服务器下载文件到本地

    通过安装xshell,连接服务器,通过以下命令可以方便的将服务器的文件下载到本地 #下载一个文件 sz filename #下载多个文件 sz filename1 filename2 #下载dir目录 ...

  6. Java Mail邮件发送的简单实现

    1.什么是java mail JAVA MAIL是利用现有的邮件账户发送邮件的工具,通过JAVA Mail的操控,让程序自动的使用设置的邮箱发送邮件. 这一机制被广泛的用在注册激活和垃圾邮件的发送等方 ...

  7. mysql应用学习-windows(64位)安装和配置mysql(5.6.20)

    下载安装包MySQL Installer 下载地址1:http://dev.mysql.com/downloads/windows/installer/ 说明:官网当前版本 5.6.22:虽然只有32 ...

  8. SpringMVC:系统认识一下maven

    网上看了很多springMVC helloworld的教程,非常不满意:首先,maven构建的就很少,再者,绝大部分都是断章取义,让人不明就里.其中有几篇讲的好的,我摘录了一些,自己试着构建了一下项目 ...

  9. java基础--常用函数总结

    java基础--常用函数总结 2019-3-16-23:28:01-----云林原创 1.split()字符串分割函数 将一个字符串分割为子字符串,然后将结果作为字符串数组返回. 2.Math.flo ...

  10. Thrift笔记(四)--Thrift client源码分析

    thrift文件 namespace java com.gxf.demo namespace py tutorial typedef i32 int // We can use typedef to ...