2 条题解

  • 0
    @ 2025-10-8 16:52:00
    #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
      @ 2025-10-8 16:51:55
      #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
      上传者