BZOJ 1624 [Usaco2008 Open] Clear And Present Danger 寻宝之路:floyd

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1624

题意:

  农夫约翰正驾驶一条小艇在牛勒比海上航行。

  海上有N(1≤N≤100)个岛屿,用1到N编号。

  约翰从1号小岛出发,最后到达N号小岛。

  一张藏宝图上说,如果他的路程上经过的小岛依次出现了Ai,A2,…,AM(2≤M≤10000)这样的序列(不一定相邻),那他最终就能找到古老的宝藏。

  但是,由于牛勒比海有海盗出没.约翰知道任意两个岛屿之间的航线上海盗出没的概率,他用一个危险指数Dij(0≤Dij≤100000)来描述。

  他希望他的寻宝活动经过的航线危险指数之和最小。

  那么,在找到宝藏的前提下,这个最小的危险指数是多少呢?

 

题解:

  floyd.

  然后求从1到a[1]、a[1]到a[2]...a[m]到n的dis之和。

 

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #define MAX_N 105
 5 #define MAX_M 10005
 6 
 7 using namespace std;
 8 
 9 int n,m;
10 int ans=0;
11 int a[MAX_M];
12 int dis[MAX_N][MAX_N];
13 
14 void read()
15 {
16     cin>>n>>m;
17     a[0]=1;
18     a[m+1]=n;
19     for(int i=1;i<=m;i++)
20     {
21         cin>>a[i];
22     }
23     for(int i=1;i<=n;i++)
24     {
25         for(int j=1;j<=n;j++)
26         {
27             cin>>dis[i][j];
28         }
29     }
30 }
31 
32 void floyd()
33 {
34     for(int k=1;k<=n;k++)
35     {
36         for(int i=1;i<=n;i++)
37         {
38             for(int j=1;j<=n;j++)
39             {
40                 if(i!=j && j!=k && i!=k)
41                 {
42                     dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
43                 }
44             }
45         }
46     }
47 }
48 
49 void solve()
50 {
51     floyd();
52     for(int i=0;i<=m;i++)
53     {
54         ans+=dis[a[i]][a[i+1]];
55     }
56 }
57 
58 void print()
59 {
60     cout<<ans<<endl;
61 }
62 
63 int main()
64 {
65     read();
66     solve();
67     print();
68 }

 

posted @ 2017-09-29 23:26  Leohh  阅读(92)  评论(0编辑  收藏  举报