【POJ3311】Hie With The Pie 状压dp

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=11,M=1<<N;
int G[N][N];
int dp[M][N];
int n;
int main()
{
    while(scanf("%d",&n),n)
    {
        memset(dp,0x3f,sizeof dp);
        for(int i=0; i<=n; i++)
            for(int j=0; j<=n; j++)
                scanf("%d",&G[i][j]);

        for(int k=0; k<=n; k++)
            for(int i=0; i<=n; i++)
                for(int j=0; j<=n; j++)
                    G[i][j]=min(G[i][j],G[i][k]+G[k][j]);

        for(int i=0; i<=n; i++)
            dp[1<<i][i]=G[0][i];

        for(int i=0; i<=(1<<(n+1))-1; i++)
            for(int j=0; j<=n; j++)
                if((i>>j)&1)
                    for(int k=0; k<=n; k++)
                        if(((i^(1<<j))>>k)&1)
                            dp[i][j]=min(dp[i][j],dp[i^(1<<j)][k]+G[k][j]);

        int ans=0x3f3f3f3f;
        for(int i=0; i<=n; i++)
            ans=min(ans,dp[(1<<(n+1))-1][i]+G[i][0]);
        printf("%d\n",ans);
    }
    return 0;
}

发布了19 篇原创文章 · 获赞 19 · 访问量 672

猜你喜欢

转载自blog.csdn.net/qq_44086097/article/details/104194417