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. Memcached与Spring集成的方式(待实践)

    主要是基于这几种方式http://www.cnblogs.com/EasonJim/p/7624822.html去实现与Spring集成,而个人建议使用Xmemcached去集成好一些,因为现在官方还 ...

  2. MongoDB小结24 - 索引简介2

    索引的名字 集合中每个索引都有一个字符串类型的名字,来唯一标识索引. 服务器通过名字来操作或者删除索引. 要注意的是,索引名有字符个数限制,所以索引创建时一定要用自定义的名字,如 db.user.en ...

  3. 一 hadoop 相关介绍

    hadoop 相关介绍 hadoop的首页有下面这样一段介绍.对hadoop是什么这个问题,做了简要的回答. The Apache™ Hadoop® project develops open-sou ...

  4. android的ListView点击item使item展开的做法

    直接上代码把.主要是又一次给item measure高度,直接上代码把 import java.util.ArrayList; import android.app.Activity; import ...

  5. Linux VSFTP服务器

    Linux VSFTP服务器 一.Linux FTP服务器分类: <1>wu-ftp <2>proftp=profession ftp <3>vsftp=very ...

  6. 从Linux内核升级的必要性说开去

    Linux内核更新超级频繁,可是有必要时刻升级吗?个人感觉没有必要,可是你要时刻关注新特性列表,然后把自己的内核升级到离最新版本号差一两个月公布的版本号而不是最新版本号.以保证稳定性,由于一两个月的时 ...

  7. iOS 特定图片的button的旋转动画

    近期做的东西中,要为一个有特定图片的button加入旋转动画,Demo代码例如以下: #import "ViewController.h" @interface ViewContr ...

  8. Android自己定义dialog中的EditText无法弹出键盘的解决

    近期我独立开发的项目<全医会>已经在内測其中了.非常快将会上架到各大应用市场.之前开发的几个项目都由于一些原因没有上架还是比較遗憾的.所以,近期我心情格外的好. 今天在做一个新项目,专为律 ...

  9. 纯css3实现美化复选框和手风琴效果(详细)

    关键技术点和原理: 原理就是把 checkbox或 radio 给隐藏掉   ,然后给选框 绑定一个label标签. 然后用label标签作为容器,在里面放一个:before或一个after 用bef ...

  10. sar 找出系统瓶颈的利器 目前Linux上最为全面的系统性能分析工具之一 直接 sar -dur 1 30 即可看内存 CPU和IO占用

    12. sar 找出系统瓶颈的利器 sar是System Activity Reporter(系统活动情况报告)的缩写.sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行 ...