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

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

 对于每一个城市只有去过和没去过两种状态,用一个二进制数s来表示
 f[s][i]当前在第i个城市,状态为s时的最小花费,&运算有0落0,所以s&1<<(j-1)保证了
 i城市的s状态 |运算有1落1 这样便可以找到一个从j到i的状态,用于更新答案

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int mp[20][20];
 6 int f[70010][20];
 7 int n,ans = 1e9;
 8 void floyd()
 9 {
10     for (int k=1; k<=n; ++k)
11         for (int i=1; i<=n; ++i)
12             for (int j=1; j<=n; ++j)
13                 if (i!=j&&k!=i)
14                     mp[i][j] = min(mp[i][j],mp[i][k]+mp[k][j]);
15 }
16 void dp()
17 {
18     memset(f,0x3f,sizeof(f));
19     f[1][1] = 0;
20     for (int s=0; s<=(1<<n)-1; s++)
21         for (int i=1; i<=n; i++)
22         {
23             for (int j=1; j<=n; j++)
24                 if (s&1<<(j-1)&&i!=j)
25                     f[s|(1<<i-1)][i] = min(f[s|(1<<i-1)][i],f[s][j]+mp[j][i]);
26         }
27     for(int i=2; i<=n; i++) 
28         ans = min(ans,f[(1<<n)-1][i]+mp[i][1]);
29 }
30 int main()
31 {
32     scanf("%d",&n);
33     for (int i=1; i<=n; ++i)
34         for (int j=1; j<=n; ++j)
35             scanf("%d",&mp[i][j]);
36     floyd();
37     dp();
38     printf("%d",ans);
39     return 0;
40 }

 

转载于:https://www.cnblogs.com/mjtcn/p/7028456.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值