NOIP2017所有1~2题题解总汇:本蒟蒻的另一个博客(不过博客没备份(源码),删了,只好先来优快云上了)
就是用搜索,只能过luogu
#define N 20
int n,d[N][N],ans,t[N],h[N];
void dfs(int x,int w)
{
if(ans<=w)
return;
if(x==n+1)
{
ans=w;
return;
}
fr(i,1,x-1)
if(d[t[x]][t[i]]+1)
{
h[t[x]]=h[t[i]]+1;
dfs(x+1,w+d[t[x]][t[i]]*h[t[x]]);
}//向前面的点连边
}
#include<stdlib.h>
int main()
{
n=read();
fr(i,1,n)
fr(j,1,n)
d[i][j]=-1;
fr(i,1,read())
{
int u=read(),v=read(),w=read();
if(d[u][v]==-1)
d[u][v]=d[v][u]=w;
else
d[u][v]=d[v][u]=min(d[u][v],w);
}
ans=(1<<20);
fr(i,1,n)
t[i]=i;
srand((unsigned long long)new char);
fr(i,1,5040)
{
fr(i,1,n*n)
swap(t[rand()%n+1],t[rand()%n+1]);//随机一个排列
fr(i,1,n)
h[i]=0;
dfs(2,0);
}
printf("%d\n",ans);
return 0;
}