1 条题解

  • 0
    @ 2025-10-8 16:55:40

    // 60分代码

    #include<bits/stdc++.h>
    using namespace std;
    int a[25][25],n,ans;
    bool v[210];
    void dfs(int x,int dep,int s)
    {
    	if(ans<=s) return ;
        if(dep==n)
        {
        	ans=min(ans,s+a[x][n]);return ;
        }
        for(int i=2;i<n;i++)
        {
            if(v[i]==0)
            {
                v[i]=1;
                dfs(i,dep+1,s+a[x][i]);
                v[i]=0;
            }
        }
    }
     
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&a[i][j]);
        memset(v,0,sizeof(v));v[1]=1;v[n]=1;
        ans=999999999;
    	dfs(1,2,0);//当前在1号点(一开始可以从任意点出发),准备找第2个点
        printf("%d\n",ans);
        return 0;
    }
    

    // 100分代码,状态压缩

    #include<bits/stdc++.h>
    using namespace std;
    int a[25][25];
    int f[(1<<20)][21];
    int main()
    {
        int n;scanf("%d",&n);
        for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&a[i][j]);
        memset(f,63,sizeof(f));
        f[1][1]=0;
        for(int i=1;i<=(1<<n)-1;i++)
        {
            for(int j=1;j<=n;j++)if((i&(1<<(j-1)))>0)
            {
                for(int z=1;z<=n;z++)if((i&(1<<(z-1)))==0)
                {
                    f[i+(1<<(z-1))][z]=min(f[i+(1<<(z-1))][z],f[i][j]+a[j][z]);
                }
            }
        }
        printf("%d\n",f[(1<<n)-1][n]);
        return 0;
    }
    
    • 1

    【哈密顿路径+状压DP】最短 Hamilton 路径

    信息

    ID
    1113
    时间
    5000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    58
    已通过
    29
    上传者