宝藏

题目链接

首先,打了一个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. 让C:\Users文件夹放在D盘

    新安装win7 在安装Win7的过程中,要求输入用户名及密码的时候,先不如输入任何信息,按“Shift+F10”呼出DOS窗口,输入以下命令: robocopy "C:\Users" ...

  2. [转]Show parameter & Table Not exists

    本文转自:http://www.cnblogs.com/fangwenyu/archive/2011/01/06/1926774.html 问题描述 在尝试通过show parameter来查看一个参 ...

  3. 在 Visual Studio 中调试 XAML 设计时异常

    在 Visual Studio 中进行 WPF, UWP, Silverlight 开发时,经常会遇到 XAML 设计器由于遭遇异常而无法正常显示设计器视图的情况.很多时候由于最终生成的项目在运行时并 ...

  4. CSP学习之CryptoAPI初识

    Crypto API目的就是提供开发者在windows下使用PKI的编程接口. Crypto 提供了很多的加解密相关函数,如编码.解码.加密解密,哈希,数字证书.证书管理证书存储等.       有关 ...

  5. PAT 1070 Mooncake

    题目意思能搞成这样我也是服了这个女人了 #include <cstdio> #include <cstdlib> #include <vector> #includ ...

  6. vue.js练习经验总结

    1.最好JSON数据与(模板里 v-bind里绑定的自定义属性不要重名),根据console控制台的提示来看,应该是重名所引起的编译错误 2.还有个很奇怪的问题,局部注册vue的过滤器,到了模板之后不 ...

  7. centos7 版本防火墻操作和配置

    1.关闭firewall:systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止fire ...

  8. Django——form组件和ModelForm

    一.原生form实现书城增删改查 1.构建模型并完成数据库迁移 (1)构建书城模型 from django.db import models # Create your models here. # ...

  9. caffe-windows之网络描述文件和参数配置文件注释(mnist例程)

    caffe-windows之网络描述文件和参数配置文件注释(mnist例程) lenet_solver.prototxt:在训练和测试时涉及到一些参数配置,训练超参数文件 <-----lenet ...

  10. em和px区别

    附:(http://www.cnblogs.com/leejersey/p/3662612.html) em单位说明 1em指的是一个字体的大小,它会继承父级元素的字体大小,因此并不是一个固定的值.任 ...