宝藏

题目链接

首先,打了一个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. word 快捷键

    Ctrl+shift+F9  清除word文档中的超链接

  2. Coursera 机器学习 第6章(下) Machine Learning System Design 学习笔记

    Machine Learning System Design下面会讨论机器学习系统的设计.分析在设计复杂机器学习系统时将会遇到的主要问题,给出如何巧妙构造一个复杂的机器学习系统的建议.6.4 Buil ...

  3. CF 304B——Calendar——————【年月日计算】

    B - Calendar Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submi ...

  4. java线程的interrupt方法

    java现成的interrupt方法比较容易误导新手,它其实是不会中断(停止)当前的线程,只是标志一下当前线程的某个状态值(中断标志位),并且这个状态为只对阻塞方法(比如说:             ...

  5. tomcat-dbcp数据库连接池配置以及使用时候的一些坑

    一.数据库连接池 开发的时候经常会需要对数据库进行一些操作,比如说常见的增删改查之类的,当数据量小的时候,可以直接进行操作,但是当数据量增多的时候,每一次连接以及释放数据库都会耗费一定的时间,这个时候 ...

  6. 获取memcache中所有数据

    remap_table方法是用的一个框架写的: $gvs = $this->pageObj->get;是获取通过get方式传递过来的数据: $mem = $this->pageObj ...

  7. CRM——权限

    一.引入权限组件 1.引入权限组件rbac 拷贝之前写好的rbac应用到CRM_demo项目下. 在settings中注册rbac的app: INSTALLED_APPS = [ 'django.co ...

  8. cf1072D. Minimum path(BFS)

    题意 题目链接 给出一个\(n \times n\)的矩阵,允许修改\(k\)次,求一条从\((1, 1)\)到\((n, n)\)的路径.要求字典序最小 Sol 很显然的一个思路是对于每个点,预处理 ...

  9. spring----spring中的注解@service等的作用

    service  是有用的相当于 xml配置中得bean  id = service  也可以不指定 不指定相当于 bean id =  com. service.service 就是这个类的全限定名 ...

  10. Flume的load-balance、failover

    配置flume集群参考https://www.cnblogs.com/jifengblog/p/9277793.html load-balance负载均衡 介绍 负载均衡是用于解决一台机器(一个进程) ...