题目大意:输入一个n*n的矩阵safe(),safe(i,j)表示从i到j的安全度,0表示i无法直接到j,从a经过b,c,d点到达e点的总安全度s=sb*sc*sd;让求出从给定起点到终点的最安全的路线的安全度。
本来想用Dijkstra算法做的,然后一看,有多组起点和终点,果断Floyd了。
#include <cstdio> #include <iostream> #define MAX 1010 #define INF 999999999 using namespace std; double safe[MAX][MAX]; void Floyd(int n) { int i,j,k; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(safe[i][j]<safe[i][k]*safe[k][j]) safe[i][j]=safe[i][k]*safe[k][j]; } int main() { int i,j,t,a,b,n; while(scanf("%d",&n)!=-1) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%lf",&safe[i][j]); scanf("%d",&t); Floyd(n); while(t--) { scanf("%d%d",&a,&b); if(safe[a][b]==0) puts("What a pity!"); else printf("%.3f\n",safe[a][b]); } } return 0; }