Hie with the Pie (POJ 3311) 旅行商问题

Posted izcat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hie with the Pie (POJ 3311) 旅行商问题相关的知识,希望对你有一定的参考价值。

    昨天想练习一下状态压缩,百度搜索看到有博客讨论POJ 3311,一看就是简单的旅行商问题,于是快速上手写了状态压缩,死活样例都没过。。。

    画图模拟一遍原来多个城市可以重复走,然后就放弃思考了。。。

    刚刚把这个无聊的问题解决了,简单的Floyd+状压。

    所谓Floyd算法,我在暑训的博客里提过,复杂度O(n3),但当时数据量太大不适合使用,这里刚好派上了用场。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

const int INF = 0x3f3f3f3f;
int dis[12][12], n;
int dp[1<<12][12]; // dp[S][u] 从u出发从S的剩下城市走到0的最短时间

int dfs(int S, int u)
{
    if(dp[S][u]>0)
        return dp[S][u];

    if(S==(1<<(n+1))-1 && u==0)
        return dp[S][u] = 0;

    int res = INF;
    for(int v=0;v<=n;v++)
    {
        if(v!=u && !((S>>v)&1))
            res = min(res, dfs(S|(1<<v), v)+dis[u][v]);

    }
    return dp[S][u] = res;
}
int main()
{
    while(cin>>n)
    {
        if(n==0) break;

        for(int i=0;i<=n;i++)
        for(int j=0;j<=n;j++)
            cin>>dis[i][j];

        // Floyd算法
        for (int k=0;k<=n;k++)
            for (int i=0;i<=n;i++)
                for (int j=0;j<=n;j++)
                    dis[i][j] = min(dis[i][j], dis[i][k]+dis[k][j]);
memset(dp,
-1, sizeof(dp)); cout<<dfs(0, 0)<<endl; } return 0; }

    交一发直接AC了感觉索然无味啊。。。还是要多找点难题刷刷 0.0

 

以上是关于Hie with the Pie (POJ 3311) 旅行商问题的主要内容,如果未能解决你的问题,请参考以下文章

poj3311Hie with the Pie

Hie with the Pie(poj3311)

Hie with the Pie(POJ 3311)状压DP

POJ 3311---Hie with the Pie(状压DP)

[POJ3311]Hie With The Pie

Hie with the Pie POJ - 3311