3122 奶牛代理商 VIII

时间限制: 3 s
空间限制: 256000 KB
题目等级 : 大师 Master
 
 
 
题目描述 Description

小徐是USACO中国区的奶牛代理商,专门出售质优价廉的“FJ"牌奶牛。

有一天,她的奶牛卖完了,她得去美国进货。

她需要去N个奶牛农场询问价格(小徐是个认真的人,买东西一定要货比三家)。

给你一个邻接矩阵,表示N个农场间的路径长度,求小徐最少走多少路。(从农场1出发,最后回到出发点买)

输入描述 Input Description

N

邻接矩阵

输出描述 Output Description

答案(见描述)

样例输入 Sample Input

3

0 1 2

3 0 10

2 0 0

样例输出 Sample Output

5

数据范围及提示 Data Size & Hint

N<=15,路径长度<=1000

TSP

分类标签 Tags 点此展开

状压DP好恶心啊。。

这道题的关键点有两个,

1.走过所有的点

2.最短路径

第2个最短路径比较好解决,n<=16的话,,一遍Floyd就可以

但是第一个条件,要走过所有的点。

我们可以考虑用状态压缩的方法来实现

我们可以用一个二进制的字符串表示这个点是否走过,比如说110表示已经走过了1和2这两个点,第3个点还没有经过

代码思路:

设置一个dp数组,dp[now][j]表示在now状态下,到达点j所需要的花费

首先我们需要暴力枚举i和j两点,来求最短距离

其次,我们还需要枚举一个能够包揽所有状态的变量now,来记录每一个能够到达的状态

当状态now可以到达j的话,那么说明我们可以通过这个状态到达i(i和j之间必定有路径)

最后枚举每个点,取一下最小值就可以

细节问题:

1.跑floyd的时候不要预先设定最大值,因为每两个点(不相同)之间必定有边相连

2.dp数组的第一位必须要开的足够大,最小是2^16,因为第一维记录的是状态而不是大小

3.now<=(1<<n)-1:

  当n==3时,1<<3 == 2^3 == 8 == 1000

  1000-1=111正好是三个点都到达的理想情况

4.now&(1<<(j-1))

  j-1是为了不超边界且枚举出所有情况

  首先要明确,1<<(j-1)得到的一定是一个2^x的数,转换成二进制一定是1+000.....的形式

  那么当now&(1<<(j-1))有值时,就说状态now是可以到达j点的

5.now|(1<<(i-1))

  在进行这个运算的时候,now一定是满足now&(1<<(j-1))!=0的(程序满足顺序执行)

  那么通过now状态一定可以到达j点

  而且1<<(i-1)也一定是一个2^x的数

  所以now|(1<<(i-1))就是一个可以通过j到达i产生的新状态

 举个栗子:

 now=110010

 i=100

 那么结果就是110110

 

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN=;
int read(int & n)
{
char p='+';int x=;
while(p<''||p>'')
p=getchar();
while(p>=''&&p<='')
x=x*+p-,p=getchar();
n=x;
}
int dp[MAXN*][MAXN];
int dis[MAXN][MAXN];
int n;
void floyed()
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
for(int k=;k<=n;k++)
if(i!=j&&j!=k&&i!=k)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
void zhuangya()
{
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<dis[i][j]<<" ";
}
cout<<endl;
}*/
memset(dp,0xf,sizeof(dp));
dp[][]=;
for(int now=;now<=(<<n)-;now++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if((now&(<<(j-)))&&i!=j)
{
dp[now|(<<(i-))][i]=
min
(
dp[now|(<<(i-))][i],
dp[now][j]+dis[j][i]
);
}
int ans=0x7ffffff;
for(int i=;i<=n;i++)
{
ans=min(ans,dp[(<<n)-][i]+dis[i][]);
}
cout<<ans;
}
int main()
{
read(n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
read(dis[i][j]);
floyed();
zhuangya();
return ;
}

3122 奶牛代理商 VIII的更多相关文章

  1. 3122 奶牛代理商 VIII(状压dp)

    3122 奶牛代理商 VIII  时间限制: 3 s  空间限制: 256000 KB  题目等级 : 大师 Master     题目描述 Description 小徐是USACO中国区的奶牛代理商 ...

  2. Codevs 3122 奶牛代理商 VIII(状压DP)

    3122 奶牛代理商 VIII 时间限制: 3 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 小徐是USACO中国区的奶牛代理商,专门出售质优 ...

  3. 2703 奶牛代理商 XII

    2703 奶牛代理商 XII  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 小徐从美国回来后,成为了USAC ...

  4. codevs 3129 奶牛代理商IX

    时间限制: 1 s  空间限制: 32000 KB  题目等级 : 白银 Silver 题目描述 Description 小X从美国回来后,成为了USACO中国区的奶牛销售代理商,专门出售质优价廉的“ ...

  5. 50.分治算法练习:  二分算法:  2703 奶牛代理商 XII

    时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 小徐从美国回来后,成为了USACO中国区的奶牛销售代理商,专门出售 ...

  6. codevs 搜索题汇总(青铜+白银级)

    1792 分解质因数  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 青铜 Bronze   题目描述 Description 编写一个把整数N分解为质因数乘积的程序. 输入描 ...

  7. 【bzoj1708】[USACO2007 Oct]Money奶牛的硬币

    题目描述 在创立了她们自己的政权之后,奶牛们决定推广新的货币系统.在强烈的叛逆心理的驱使下,她们准备使用奇怪的面值.在传统的货币系统中,硬币的面值通常是1,5,10,20或25,50,以及100单位的 ...

  8. 【bzoj1231】[Usaco2008 Nov]mixup2 混乱的奶牛

    题目描述 混乱的奶牛[Don Piele, 2007]Farmer John的N(4 <= N <= 16)头奶牛中的每一头都有一个唯一的编号S_i (1 <= S_i <= ...

  9. 【BZOJ1623】 [Usaco2008 Open]Cow Cars 奶牛飞车 贪心

    SB贪心,一开始还想着用二分,看了眼黄学长的blog,发现自己SB了... 最小道路=已选取的奶牛/道路总数. #include <iostream> #include <cstdi ...

随机推荐

  1. 微信小程序 wafer2框架摘要

    微信小程序 wafer2框架摘要 帮助文档:https://github.com/tencentyun/wafer2-startup/wiki 使用了knex.js进行数据库交互,使用了koa.js进 ...

  2. ATM取款机模拟——数据结构课设

    今天帮人写的第二篇课设 . ;-) 机智的窝 要求:大概说一下吧,就是要创建一个用户(初始化一账户),模拟ATM的业务(取款,100的整数倍,改密               码,查剩余金额.等等,各 ...

  3. cocos2d-x 3.0 CREATE_FUNC解析

    #define CREATE_FUNC(__TYPE__) \ static __TYPE__* create() \ { \ __TYPE__ *pRet = new __TYPE__(); \ i ...

  4. CF:Problem 427C - Checkposts强连通 Tarjan算法

    tarjan算法第一题 喷我一脸. ...把手写栈的类型开成了BOOL.一直在找错.. . #include<cstdio> #include<cstring> #includ ...

  5. java7新特性之Diamond syntax

    java7新特性之Diamond syntax Java 7 also introduces a change that means less typing for you when dealing ...

  6. kernel devel 安装与卸载

    1.查看系统内核 uname -r 2.查看已安装kernel-devel uname -a ; rpm -qa kernel\* | sort 3.下载对应的rpm wget xxx/kernel- ...

  7. delphi中URL的汉字编码

    delphi中URL的汉字编码 show.asp?sort=全部&sortlevel=1&gorq=供&n=5&sitename=全部&img=yes& ...

  8. URAL 1057 数位dp

    题目传送门http://acm.timus.ru/problem.aspx?space=1&num=1057 最近在学习数位dp,具体姿势可以参照这篇论文:http://wenku.baidu ...

  9. SepicalJudge

    原文:http://www.cnblogs.com/chouti/p/5752819.html Special Judge:当正确的输出结果不唯一的时候需要的自定义校验器 首先有个框架 #includ ...

  10. bzoj 1924 所驼门王的宝藏

    题目大意: 有一个r*c的矩阵,上面有n个点有宝藏 每个有宝藏的点上都有传送门 传送门有三种:第一种可以传到该行任意一个有宝藏的点,第二种可以传到该列任意一个有宝藏的点,第三种可以传到周围的八连块上有 ...