P3959 宝藏

Posted sfwr-you

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3959 宝藏相关的知识,希望对你有一定的参考价值。

技术图片

————————————————————————————————————————————————————-

单论搜索来说本题有些虚高,但结合状压思想本来就是一个难点,而且构树上还有一个dfs需要搞就更显得思维含量【误

写了一个状压搜索,自己还是太弱了,参考了别人的博客,要努力啊

————————————————————————————————————————————————————————

#include<bits/stdc++.h>
using namespace std;
int n,m,a,b,c,ans=0x3f3f3f3f,num[15][15],dp[(1<<12)+5],dis[30];
void dfs(int now)

    for(int i=1;i<=n;i++)
    if(now&(1<<i-1))
    for(int j=1;j<=n;j++)
    if(!(now&(1<<j-1))&&num[i][j]!=1061109567&&(dis[i]*num[i][j]+dp[now]<dp[now|(1<<j-1)]))
    
        dis[j]=dis[i]+1;
        dp[now|(1<<j-1)]=dis[i]*num[i][j]+dp[now];
        dfs(now|(1<<j-1));
    

int main()

    cin>>n>>m;
    memset(num,0x3f,sizeof(num));
    for(int i=1;i<=m;i++)
    
        cin>>a>>b>>c;
        num[a][b]=num[b][a]=min(num[a][b],c);
    
    for(int i=1;i<=n;i++)
        memset(dp,0x3f,sizeof(dp));
        memset(dis,0x3f,sizeof(dis));
        dp[1<<(i-1)]=0;
        dis[i]=1;
        dfs(1<<(i-1));
        ans=min(dp[(1<<n)-1],ans);
    
    cout<<ans;

 

以上是关于P3959 宝藏的主要内容,如果未能解决你的问题,请参考以下文章

题解P3959 宝藏 - 状压dp / dfs剪枝

luogu P3959 宝藏

P3959 [NOIP2017 提高组] 宝藏

题解 P3959 宝藏

P3959 宝藏 状压dp

Luogu P3959 宝藏