zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    单元测试利器 JUnit 4 Mr
    firefox插件介绍 Mr
    js函数使用技巧集合 Mr
    单点登录
    2.SilverLight动态加载控件
    3.如何获取动态生成的SL控件的NAME值(一)
    ASP.Net中控件的EnableViewState属性 【转】
    三种在ASP.NET中重写URL的方法
    SQLHelper.cs
    c# IS与AS的使用方法
  • 原文地址:https://www.cnblogs.com/izcat/p/10618740.html
Copyright © 2011-2022 走看看