BZOJ 1624: [Usaco2008 Open] Clear And Present Danger 尋寶之路

1624: [Usaco2008 Open] Clear And Present Danger 尋寶之路

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 763  Solved: 499
[Submit][Status][Discuss]

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

 
    最小的危險指數和.

Sample Input

3 4
1
2
1
3
0 5 1
5 0 2
1 2 0

INPUT DETAILS:

There are 3 islands and the treasure map requires Farmer John to
visit a sequence of 4 islands in order: island 1, island 2, island
1 again, and finally island 3. The danger ratings of the paths are
given: the paths (1, 2); (2, 3); (3, 1) and the reverse paths have
danger ratings of 5, 2, and 1, respectively.


Sample Output

7

OUTPUT DETAILS:

He can get the treasure with a total danger of 7 by traveling in
the sequence of islands 1, 3, 2, 3, 1, and 3. The cow map's requirement
(1, 2, 1, and 3) is satisfied by this route. We avoid the path
between islands 1 and 2 because it has a large danger rating.

HINT

Source


題解:Floyd就可以過。。用Floyed跑一遍,求出每兩點之間的最短的路徑,最後統計一下答案就好了。。


代碼:

#include<cstdio>
using namespace std;
int f[101][101];
int b[100001];
int n,m,ans;
int read()
{
	int f=1,x=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
int main()
{
	n=read();m=read();
	for(int i=1;i<=m;i++)
		b[i]=read();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			f[i][j]=read();
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(f[i][k]+f[k][j]<f[i][j])f[i][j]=f[i][k]+f[k][j];
	for(int i=0;i<=m;i++)
		ans=ans+f[b[i]][b[i+1]];
	printf("%d",ans);
	return 0;
}


發佈了49 篇原創文章 · 獲贊 11 · 訪問量 7397
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章