soj3160: Clear And Present Danger

xiaoxiao2021-02-28  106

soj3160: Clear And Present Danger

http://acm.scu.edu.cn/soj/problem.action?id=3160

简介题意:农夫John去找宝藏,按照藏宝图来说,他必须按照一个顺序到某些岛上才能找到,但是中间也可以去别的岛逛逛,每个岛之间海盗出没的概率给出,求出最小danger就好。

和我前几天写的基本一样啊,请参考http://blog.csdn.net/jing_laura/article/details/77653492

用Floyd,求出每两个点之间的最短路径(在此就是最小的危险系数),然后按照藏宝图的顺序,每个相加起来就行了。

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f int map[110][110]; int sequence[10010]; void Floyd(int n) { for(int k = 1;k <= n; k++) for(int i = 1;i <= n; i++) for(int j = 1;j <= n; j++) if(map[i][j]>map[i][k]+map[k][j]) map[i][j] = map[i][k] + map[k][j]; } int main() { int N,M; while(~scanf("%d%d",&N,&M)) { memset(map,0,sizeof(map)); memset(sequence,0,sizeof(sequence)); for(int i = 1;i <= M; i++) scanf("%d",&sequence[i]); for(int i = 1;i <= N; i++) for(int j = 1;j <= N; j++) scanf("%d",&map[i][j]); Floyd(N); int sum = 0; for(int i = 1;i < M; i++) sum += map[sequence[i]][sequence[i+1]]; printf("%d\n",sum); } return 0; } 要注意的还是那三个for循环,顺序颠倒做无用功也没啥意义。

转载请注明原文地址: https://www.6miu.com/read-21496.html

最新回复(0)