集训终于结束了!
感觉有些东西还不是特别清楚,等这个专题全部做完之后回来再做一遍。
#include<stdio.h>
#include<string.h>
#define N 12
#define inf 0x3f3f3f3f
int dp[60000][N],map[N][N],mark[60000][N],s[N];
int Min(int x,int y)
{
if(x<y)
return x;
return y;
}
void Init()
{
int i,j;
s[1]=1;
for(i=2; i<=11; i++)
s[i]=s[i-1]*3;
for(i=0; i<60000; i++)
{
int t=i;
for(j=1; j<=10; j++)
{
mark[i][j]=t%3;
t/=3;
}
}
return ;
}
int main()
{
Init();
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(map,inf,sizeof(map));
memset(dp,inf,sizeof(dp));
int i,j,k;
for(i=1; i<=m; i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
map[x][y]=map[y][x]=Min(z,map[x][y]);
}
for(i=1; i<=n; i++)
dp[s[i]][i]=0;
int ans=inf;
for(i=0; i<s[n+1]; i++)
{
int flag=1;
for(j=1; j<=n; j++)
{
if(mark[i][j]==0)
flag=0;
if(dp[i][j]==inf)
continue;
for(k=1; k<=n; k++)
{
int t;
t=i+s[k];
if(map[j][k]==inf||j==k||mark[i][k]==2)
continue;
dp[t][k]=Min(dp[t][k],dp[i][j]+map[j][k]);
}
}
if(flag)
{
for(j=1; j<=n; j++)
ans=Min(ans,dp[i][j]);
}
}
if(ans==inf)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}