直接FLOYD即可,但是WA了好几次,发现犯了低级错误!三个FOR循环顺序不能乱换!必需先枚举中间经过的点,后俩个随意。。。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; double a[1002][1002]; int main() { int n; while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]); for(int i=1;i<=n;i++) //三个顺序注意 for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) if(a[j][i]*a[i][k]>a[j][k]) a[j][k]=a[j][i]*a[i][k]; int event; scanf("%d",&event); while(event--) { int s,e; scanf("%d%d",&s,&e); if(!a[s][e])printf("What a pity! "); else printf("%.3f ",a[s][e]); } } return 0; }