標籤:des style blog color io ar for 資料 div
Description
農夫約翰正駕駛一條小艇在牛勒比海上航行.
海上有N(1≤N≤100)個島嶼,用1到N編號.約翰從1號小島出發,最後到達N號小島.一
張藏寶圖上說,如果他的路程上經過的小島依次出現了Ai,A2,…,AM(2≤M≤10000)這樣的序列(不一定相鄰),那他最終就能找到古老的寶藏. 但是,由於牛勒比海有海盜出沒.約翰知道任意兩個島嶼之間的航線上海盜出沒的機率,他用一個危險指數Dij(0≤Dij≤100000)來描述.他希望他的尋寶活動經過的航線危險指數之和最小.那麼,在找到寶藏的前提下,這個最小的危險指數是多少呢? Input
第1行輸入N和M,之後M行一行一個整數表示A序列,之後輸入一個NxN的方陣,表示兩兩島嶼之間航線的危險指數.資料保證Dij=Dji,Dii=0. Output
最小的危險指數和.
題解:
因為要依次出現,從Ai到Ai+1,其中走的一定是它倆之間的最短路,所以可以對整個圖Floyd。然後將兩兩之間最短路加起來就是答案。
代碼:
#include<cstdio>#include<cstring>#include<algorithm>//by zrt//problem:using namespace std;int n;int dis[105][105]; int m,a[10005];int main(){ #ifdef LOCAL freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d",&a[i]); } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%d",&dis[i][j]); } } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); } } } long long ans=0; for(int i=2;i<=m;i++){ ans+=dis[a[i-1]][a[i]]; } printf("%lld\n",ans); return 0;}
BZOJ 1624: [Usaco2008 Open] Clear And Present Danger 尋寶之路