————————————————————————————————————————————————————-
单论搜索来说本题有些虚高,但结合状压思想本来就是一个难点,而且构树上还有一个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; }