华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1069|回复: 1
打印 上一主题 下一主题

P1690 贪婪的Copy

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2018-7-28 09:34:43 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
https://www.luogu.org/problemnew/show/P1690

题目描述
Copy从卢牛那里听说在一片叫yz的神的领域埋藏着不少宝藏,于是Copy来到了这个被划分为个区域的神地。卢牛告诉了Copy这里共有个宝藏,分别放在第Pi个(1<=Pi<=N)区域。Copy还得知了每个区域之间的距离。现在Copy从1号区域出发,要获得所有的宝藏并到n号区域离开。Copy很懒,只好来找你为他寻找一条合适的线路,使得他走过的距离最短。

输入输出格式
输入格式:
第一行一个正整数N(1<=N<=100)

接下来一个N*N的矩阵,第i+1行第j列的数字表示区域i,j之间的距离。每个距离用空格隔开,距离保证i,j<=1000。请注意的i to j距离并不一定等于j to i的距离。

第N+2行一个整数P(0<=P<=10)。

第N+3行共P个用空格隔开的整数,表示有宝藏的区域编号。

输出格式:
一个整数,为Copy获得全部宝藏需要的最短距离。数据保证答案小于等于maxlongint。

输入输出样例
输入样例#1:
样例输入1
2
0 4
5 0
2
1 2

样例输入2
3
0 2 6
1 0 4
7 10 0
1
2
输出样例#1:
样例输出1
4

样例输出1
6
说明
对30%的数据,1<=n<=15,其余如题所述。

对100%的数据,全部数据范围如题所述。
回复

使用道具 举报

2

主题

105

帖子

306

积分

中级会员

Rank: 3Rank: 3

积分
306
沙发
发表于 2018-7-29 19:38:24 | 只看该作者
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <map>
  6. #include <string>
  7. #include <vector>
  8. #include <queue>
  9. #include <stack>
  10. #include <cstdio>
  11. #include <cstdlib>
  12. using namespace std;
  13. long long n,d[200][200],t,book[20],a[20],ans=0x3f3f3f3f;
  14. void dfs(long long dis,long long last)
  15. {
  16.         int e=0;
  17.         for(int i=1;i<=t;i++)
  18.                 if(!book[i])
  19.                 {
  20.                         e=1;
  21.                         book[i]=1;
  22.                         dfs(dis+d[last][a[i]],a[i]);
  23.                         book[i]=0;
  24.                 }
  25.         if(!e)
  26.                 ans=min(ans,dis+d[last][n]);
  27. }
  28. int main()
  29. {
  30.         scanf("%lld",&n);
  31.         for(int i=1;i<=n;i++)
  32.                 for(int j=1;j<=n;j++)
  33.                         scanf("%lld",&d[i][j]);
  34.         for(int k=1;k<=n;k++)
  35.                 for(int i=1;i<=n;i++)
  36.                         for(int j=1;j<=n;j++)
  37.                                 d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
  38.         scanf("%lld",&t);
  39.         for(int i=1;i<=t;i++)
  40.         {
  41.                 scanf("%lld",&a[i]);
  42.                 if(a[i]==1)
  43.                         book[i]=1;
  44.         }       
  45.         dfs(0,1);
  46.         printf("%lld",ans);
  47.     return 0;
  48. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 04:42 , Processed in 0.163782 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表