欢迎来到SFWR的博客

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;
}

 

posted @ 2019-08-03 20:48  SFWR  Views(105)  Comments(0Edit  收藏  举报