2 条题解
-
0
#include<bits/stdc++.h> using namespace std; int f[1<<16][17],a[17][17]; // f[s][j]表示状态s下,最后一个点是j的最小路径长度 int main() { int n;scanf("%d",&n); for(int i=0;i<n;i++)for(int j=0;j<n;j++)scanf("%d",&a[i][j]); memset(f,63,sizeof(f)); for(int i=0;i<n;i++) f[1<<i][i]=0; for(int s=1;s<(1<<n);s++) { for(int j=0;j<n;j++)if(s&(1<<j)) { for(int k=0;k<n;k++)if( (j!=k) && (s&(1<<k)) ) f[s][j]=min(f[s][j],f[s-(1<<j)][k]+a[k][j]); } } int ans=0x3fffffff; for(int i=0;i<n;i++)ans=min(ans,f[(1<<n)-1][i]); printf("%d\n",ans); return 0; } -
0
#include<bits/stdc++.h> using namespace std; int f[1<<16][17],a[17][17]; // f[s][j]表示状态s下,最后一个点是j的最小路径长度 int main() { int n;scanf("%d",&n); for(int i=0;i<n;i++)for(int j=0;j<n;j++)scanf("%d",&a[i][j]); memset(f,63,sizeof(f)); for(int i=0;i<n;i++) f[1<<i][i]=0; for(int s=1;s<(1<<n);s++) { for(int j=0;j<n;j++)if(s&(1<<j)) { for(int k=0;k<n;k++)if( (j!=k) && (s&(1<<k)) ) f[s][j]=min(f[s][j],f[s-(1<<j)][k]+a[k][j]); } } int ans=0x3fffffff; for(int i=0;i<n;i++)ans=min(ans,f[(1<<n)-1][i]); printf("%d\n",ans); return 0; }
- 1
信息
- ID
- 541
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- 递交数
- 76
- 已通过
- 35
- 上传者