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

猜你喜欢

转载自www.cnblogs.com/izcat/p/10618740.html