旅行商(n<15)

http://icpc.ahu.edu.cn/OJ/Problem.aspx?id=420

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <iostream>
using namespace std;

const int INF=0xfffffff;
int Min(int a,int b)
{
    return a>b?b:a;
}
int dp[20][1<<16];
int n;
int Map[20][20];
int dfs(int x,int y)
{
    if(x==0&&y==0)return 0;
    if(dp[x][y]) return dp[x][y];
    int ans=INF;
    for(int i=0;i<n;i++){
        if(y&(1<<i)){
            int tem=dfs(i,y-(1<<i)) + Map[x][i];
            ans=Min(ans,tem);
        }
    }
    return dp[x][y]=ans;
}

int cf(int a,int b)
{
    int ans=1;
    for(int i=0;i<b;i++)
        ans*=a;
    return ans;
}
int main()
{
    while(cin>>n){
        memset(dp,0,sizeof(dp));
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        if(i!=j) Map[i][j]=INF;else Map[i][j]=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            scanf("%d",&Map[i][j]);
        for(int i=0;i<n;i++){
            dp[i][0]=Map[0][i];
        }
        int k=cf(2,n)-1-1;
        cout<<dfs(0,k)<<endl;
    }
    return 0;
}

旅行商(n<15),布布扣,bubuko.com

时间: 2024-12-21 17:49:33

旅行商(n<15)的相关文章

美国13509个城镇的经纬度和TSP旅行商回路

美国13509个城镇的经纬度和TSP旅行商回路         在网上下载了美国美国13509个城镇的经纬度和TSP旅行商回路(下载网址:http://www.verysource.com/code/3731091_1/usa13509.opt.tour.html),按照网上的结果,13509个城市的回路结果是:19982859.         我认为,下面这个表里面标示的经纬度,第一个城镇经度为81.7827778,纬度为24.552.778:第二个城镇经度为81.0905556,纬度为24

18.03.09 vijos1014旅行商简化版

背景 欧几里德旅行商(Euclidean Traveling Salesman)问题也就是货郎担问题一直是困扰全世界数学家.计算机学家的著名问题.现有的算法都没有办法在确定型机器上在多项式时间内求出最优解,但是有办法在多项式时间内求出一个较优解. 为了简化问题,而且保证能在多项式时间内求出最优解,J.L.Bentley提出了一种叫做bitonic tour的哈密尔顿环游.它的要求是任意两点(a,b)之间的相互到达的代价dist(a,b)=dist(b,a)且任意两点之间可以相互到达,并且环游的路

hdoj 3001 Travelling 【3进制+旅行商】

题目:hdoj 3001 Travelling 题意:标准的旅行商加一句话,每个点最多走两次. 分析:状态转移方程一模一样,只是要三进制,因为每个点有三种状态 0 ,1 2 定义状态:dp[st][i] :在状态为 st 时 当前在 i 点的最小花费 转移方程:dp[now][j] = min(dp[now][j],dp[st][i]+mp[i][j]):now是st可以一次转移得到的状态 注意初始化. 分析: #include <cstdio> #include <algorithm&

POJ 2677 Tour 双调旅行商 dp, double+费用流

题目链接:点击打开链接 题意:给定二维平面上的n个点 从最左端点到最右端点(只能向右移动) 再返回到到最右端点(只能向左移动,且走过的点不能再走) 问最短路. 费用流: 为了达到遍历每个点的效果 把i点拆成 i && i+n 在i ->i+n 建一条费用为 -inf 的边,流量为1 这样跑最短路时必然会经过这条边,以此达到遍历的效果. dp :点击打开链接 对于i点 :只能跟一个点相连 -- 1.跟 i-1点相连 2.不跟i-1相连 用dp[i][j] 表示两个线头为 i 和 j 的

TSP 旅行商

THUOJ 数据结构(上)TSP 旅行商 点击查看题目:TSP旅行商 实现思路 建立邻接表 每读入一条边u->v,将其插入u中(后面将实现的tspNode中的边,是以其为出发点的边),并将v的入度+1 拓扑排序过程中计算最长道路经过的村庄数 算法:零入度拓扑排序,p166 of 数据结构(c++语言版)_邓俊辉 扫描所有节点,入度为0的入栈 从栈顶开始,每读一个节点a,扫描其边,相连节点b入度-1,ind变为0的入栈: 更新b'路径长度=max(a's+1,b'):更新max路径: 边界情况处理

旅行商算法

有一位旅行商,我们暂且称呼他为彪哥. 他需要前往5个城市,所以想要计算出旅程最短的路线. 对于每种路线组合,他都计算出总旅程,再挑选旅程最短的路线. 那么,算法效率的问题来了. 5个城市有120个不同的排列方式,因此需要执行120次操作. 6个城市有720个不同的排列方式,因此需要执行720次操作. 7个城市有5040个不同的排列方式,因此需要执行5040次操作. 20城市有2432902008176640000个不同的排列方式,因此需要执行2432902008176640000次操作. 综上所

dtoi2797 旅行商

题意: camp国有n座城市,由1,2,...,n编号.城市由n–1条双向道路相连.任意两个城市之间存在唯一的道路连通.有m个旅行商,第i个旅行商会从城市ai旅行到城市bi,贩卖ci件商品.已知第i个城市的居民最多购买wi件商品,bobo想知道旅行商们能够卖出商品数量的最大值. n,m<=20000. 题解:      考虑暴力,对于每一个旅行商,将其路径上的所有点都连边,然后跑最大流就可以了.不过边数太多了,会TLE. 那么这没有什么关系,我们可以树剖+线段树,将每个旅行商连向他们所对应的节点

hdu--3001--类似旅行商&lt;tsp&gt;

里面包含了很多内容的一道题 可以学到很多 题意 很简单 就是一个人 要绕城市一圈 不必回到起点 但是每个城市都要经过 并且最多每个重复走2次 注意 城市数量是 <=10的  如果 你以前就遇到过 类似的题 肯定能很快反应过来 状压dp 在某一维开个3维数组 0 1 2分别城市在该状态下经过某城市的次数为多少 所以 就是个 三进制的压缩  蛮好的 以前只听过二进制 我孤陋寡闻了 =_= dp转移方程很简单 主要是 枚举状态的时候 各种细节要注意 dp[ state+three[j] ][j] =

HDU 3001 Travelling:TSP(旅行商)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题意: 有n个城市,m条双向道路,每条道路走一次需要花费路费v.你可以将任意一个城市作为起点出发,然后遍历每一个城市,并保证同一个城市最多经过2次.问你遍历这些城市的最小费用是多少. 题解: 传统的TSP问题中,每个城市只能经过一次,做法为三重for循环,分别枚举城市的state.现在所处位置i.下一步要到达的城市j. 核心Code: 1 memset(dp,-1,sizeof(dp)); 2