传送门
【题目分析】
看看这只有12的数据规模,那么状压没跑了。
转移也很好想,枚举起点,更新dp值。。。。。。然后就被hack了。。。。。
hack数据:6 6 1 2 100 2 3 1 2 4 10 3 4 10 3 5 100 4 6 10000
所以这就是所谓的错误做法又没卡。。。。。。
所以放一篇写的很好的博客:传送门
所以这里我就放一个状压的程序了qwq(至于膜你退火什么的不会啊qwq
【代码~】
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1<<12;
const int MAXM=2e3+10;
const int INF=0x3f3f3f3f;
int n,m,cnt,ans=INF;
int dp[MAXN];
int head[20];
int nxt[MAXM],to[MAXM],w[MAXM],depth[MAXN];
int dis[15][15];
int Read(){
int i=0,f=1;
char c;
for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-')
f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())
i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
void add(int x,int y,int z){
nxt[cnt]=head[x];
head[x]=cnt;
to[cnt]=y;
w[cnt]=z;
cnt++;
}
void dfs(int status){
for(int i=1;i<=n;++i){
if(status&(1<<(i-1))){
for(int j=1;j<=n;++j){
if(!(status&(1<<(j-1)))&&dis[i][j]!=INF&&dp[status|(1<<(j-1))]>dp[status]+dis[i][j]*depth[i]){
dp[status|(1<<(j-1))]=dp[status]+dis[i][j]*depth[i];
int x=depth[j];
depth[j]=depth[i]+1;
dfs(status|(1<<(j-1)));
depth[j]=x;
}
}
}
}
}
int main(){
memset(dis,INF,sizeof(dis));
memset(head,-1,sizeof(head));
n=Read(),m=Read();
for(int i=1;i<=m;++i){
int x=Read(),y=Read(),z=Read();
dis[x][y]=min(z,dis[x][y]);
dis[y][x]=min(z,dis[y][x]);
}
int mask=1<<n;
for(int i=1;i<=n;++i){
memset(dp,INF,sizeof(dp));
dp[1<<(i-1)]=0;
memset(depth,0,sizeof(depth));
depth[i]=1;
dfs(1<<(i-1));
ans=min(ans,dp[mask-1]);
}
cout<<ans;
return 0;
}