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. SQL PATINDEX检索

    语法格式:PATINDEX ( '%pattern%' , expression ) 返回pattern字符串在表达式expression里第一次出现的位置,起始值从1开始算. pattern字符串在 ...

  2. MongoDB小结25 - 复合唯一索引

    只要满足索引的其中之一不同即可 db.blog.ensureIndex({"username":1,"blogname":1}) 作者和作品名其中之一不同即可创 ...

  3. Windows系统下查看已共享的文件夹的方法

    电脑使用时间比较长,共享过好几次文件夹,现在想取消共享,但共享文件夹的路径隐藏得太深,要怎么样才能快速找到共享文件夹的实际路径呢?” “其实现在单位常见的方法都是用网上邻居的共享文件夹,共享的文件夹也 ...

  4. PyMySQL - Python3 MySQL数据库连接 - 基本操作

    一.Python连接MySQL数据库   1.导入模块 #导入模块 import pymysql   2.打开数据库连接 #打开数据库连接 #注意:这里已经假定存在数据库testdb,db指定了连接的 ...

  5. uva 439 Knight Moves 骑士移动

    这道题曾经写过,bfs.用队列,不多说了,上代码: #include<stdio.h> #include<stdlib.h> #include<string.h> ...

  6. chrome.socket

    chrome.socket https://chajian.baidu.com/developer/apps/socket.html#method-create 描述: 使用 chrome.socke ...

  7. SPOJ 15. The Shortest Path 最短路径题解

    本题就是给出一组cities.然后以下会询问,两个cities之间的最短路径. 属于反复询问的问题,临时我仅仅想到使用Dijsktra+heap实现了. 由于本题反复查询次数也不多,故此假设保存全部最 ...

  8. ASP.NET MVC Model之二模型绑定

    Asp.net mvc中的模型绑定,或许大家经常用,但是具体说他是怎么一回事,可能还是会有些陌生,那么,本文就带你理解模型绑定.为了理解模型绑定,本文会先给出其定义,然后对通过比,来得出使用模型绑定的 ...

  9. java连接Oracle案例

    首先来讲一下桥连接: 首先配置数据源:打开控制面板——管理工具——数据源(ODBC)——用户DSN——添加——找到Oracle驱动程序. //JDBC-ODBC桥连接public class Conn ...

  10. AndroidCommon示例

    效果图如下:              1) 自动滚动无限循环ViewPager.ViewPager嵌套自动滚动ViewPager (2) 网络缓存Demo (3) 图片缓存Demo,图片SD卡缓存D ...