1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 768 Solved: 503
[ 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
Sample Output
7
一看题还以为是很神奇的难题
仔细想想好像只用floyd一遍然后暴力就好了
#include<stdio.h>
#include<algorithm>
using namespace std;
int road[105][105], a[10005] = {1};
int main(void)
{
int n, m, i, j, k, ans;
while(scanf("%d%d", &n, &m)!=EOF)
{
for(i=1;i<=m;i++)
scanf("%d", &a[i]);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
scanf("%d", &road[i][j]);
}
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
road[i][j] = min(road[i][j], road[i][k]+road[k][j]);
}
}
ans = 0;
for(i=1;i<=m;i++)
ans += road[a[i-1]][a[i]];
printf("%d\n", ans+road[a[m]][n]);
}
return 0;
}