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 }