标签:
这题就是个裸的Floyd算法,只不过是用最短路的思想求最长路罢了。也没有卡精度。题目也给了计算公式(两点之间的安全系数就是经过的所有路线的安全系数的乘积)
#include <iostream> #include <vector> #include <memory.h> #include <stdio.h> using namespace std; float V[1005][1005]; int N,Q; void Floyd() { for(int k=0;k<N;k++) { for(int i=0;i<N;i++) { for(int j=0;j<N;j++) { if(k==i||k==j) continue; //改为求最高安全系数,加入编号为k的点,看安全系数会不会变大 V[i][j]=max(V[i][j],V[i][k]*V[k][j]); } } } } int main() { int S,E; while(~scanf("%d",&N)) { for(int i=0;i<N;i++) { for(int j=0;j<N;j++) { scanf("%f",&V[i][j]); V[j][i]=V[i][j]; } } Floyd(); scanf("%d",&Q); for(int i=0;i<Q;i++) { scanf("%d%d",&S,&E); if(V[S-1][E-1]==0) { cout<<"What a pity!"<<endl; } else printf("%.3f\n",V[S-1][E-1]); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/modengdubai/p/4725539.html