1 条题解

  • 1
    @ 2022-7-16 21:44:15
    #include<bits/stdc++.h>
    using namespace std;
    int f[1<<20][20],w[20][20],n;
    int main()
    {
    	memset(f,0x3f,sizeof f);
    	f[1][0]=0;
    	cin>>n;
    	for(int i=0;i<n;++i)
    		for(int j=0;j<n;++j)
    			scanf("%d",&w[i][j]);
    	for(int i=1;i<(1<<n);i+=2) 
    	{
    		for(int j=0;j<n;j++)
    		{
    			if(!((i >> j) & 1)) continue; //当前i状态下,根本没有走过j
    			for(int k=0;k<n;k++)
    			{
    				if(j==k) continue;       //从自己到自己?。。。 
    				if(!(i>>k &1)) continue; //上一次状态,根本没有走过k,就更不可能从k转移到j
    				f[i][j]=min(f[i][j],f[i^(1<<j)][k]+w[k][j]);
    			}
    		}
    	}
    	int minn=8848888;
    	for(int i=0;i<=n-1;++i)
    	{
    		minn=min(minn,f[(1<<n)-1][i]+w[i][0]);
    	}
    	cout<<minn;//所有点走完,最后停在n-1点上
    }
    
    • 1

    信息

    ID
    172
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    递交数
    2
    已通过
    2
    上传者