2 条题解

  • 0
    @ 2025-10-8 16:52:15
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    LL mp[210][210],mpp[15][15],f[1<<14][15];
    int a[15],d[15];
    int main()
    {
        int m,n;scanf("%d%d",&m,&n);
        memset(mp,63,sizeof(mp)); 
        for(int k=1,x,y;k<=m;k++)
    	{
            long long c;scanf("%d%d%lld",&x,&y,&c);
            mp[x][y]=mp[y][x]=min(mp[x][y],c);
        }
        int p;scanf("%d",&p);for(int i=1;i<=p;i++)scanf("%d",&a[i]);
        sort(a+1,a+p+1);
        
        if(a[p]!=n)a[++p]=n;
    	if(a[1]!=1)a[++p]=1;//点1是出发点,点n是结束点,如果1和n不是宝藏点,那么也要加入a数组 
        
        sort(a+1,a+p+1);
         
        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++)if(i!=k)
                for(int j=1;j<=n;j++)if(j!=k&&j!=i)
    				mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
    	//用Floyd算法使得mp数组为任意两个点最短的距离值 
        memset(mpp,63,sizeof(mpp));
        for(int i=1;i<=p;i++)for(int j=1;j<=p;j++)mpp[i][j]=mp[a[i]][a[j]];
    	//用所有宝藏点重新构图 
        memset(f,63,sizeof(f));f[1][1]=0;
        d[1]=1;for(int i=2;i<=p;i++)d[i]=d[i-1]*2;
        for(int s=0;s<(1<<p);s++)
        	for(int j=1;j<=p;j++)if(s&d[j])
        		for(int k=1;k<=p;k++)if((j!=k)&&(s&d[k]))
        			f[s][j]=min(f[s][j],f[s-d[j]][k]+mpp[k][j]);
        if(f[(1<<p)-1][p]==f[0][0])printf("-1\n");
        else printf("%lld\n",f[(1<<p)-1][p]); 
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:51:57
      #include<bits/stdc++.h>
      using namespace std;
      typedef long long LL;
      LL mp[210][210],mpp[15][15],f[1<<14][15];
      int a[15],d[15];
      int main()
      {
          int m,n;scanf("%d%d",&m,&n);
          memset(mp,63,sizeof(mp)); 
          for(int k=1,x,y;k<=m;k++)
      	{
              long long c;scanf("%d%d%lld",&x,&y,&c);
              mp[x][y]=mp[y][x]=min(mp[x][y],c);
          }
          int p;scanf("%d",&p);for(int i=1;i<=p;i++)scanf("%d",&a[i]);
          sort(a+1,a+p+1);
          
          if(a[p]!=n)a[++p]=n;
      	if(a[1]!=1)a[++p]=1;//点1是出发点,点n是结束点,如果1和n不是宝藏点,那么也要加入a数组 
          
          sort(a+1,a+p+1);
           
          for(int k=1;k<=n;k++)
              for(int i=1;i<=n;i++)if(i!=k)
                  for(int j=1;j<=n;j++)if(j!=k&&j!=i)
      				mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
      	//用floyed算法使得mp数组为任意两个点最短的距离值 
          memset(mpp,63,sizeof(mpp));
          for(int i=1;i<=p;i++)for(int j=1;j<=p;j++)mpp[i][j]=mp[a[i]][a[j]];
      	//用所有宝藏点重新构图 
          memset(f,63,sizeof(f));f[1][1]=0;
          d[1]=1;for(int i=2;i<=p;i++)d[i]=d[i-1]*2;
          for(int s=0;s<(1<<p);s++)
          	for(int j=1;j<=p;j++)if(s&d[j])
          		for(int k=1;k<=p;k++)if((j!=k)&&(s&d[k]))
          			f[s][j]=min(f[s][j],f[s-d[j]][k]+mpp[k][j]);
          if(f[(1<<p)-1][p]==f[0][0])printf("-1\n");
          else printf("%lld\n",f[(1<<p)-1][p]); 
          return 0;
      }
      • 1

      信息

      ID
      827
      时间
      1000ms
      内存
      128MiB
      难度
      8
      标签
      递交数
      155
      已通过
      26
      上传者