[Floyd] Jzoj P1224 最小密度路径
题解
- 设f[i][j][k]表示从i到j的路径走了k条边的最短路径,其实就是跟Floyd一样多了一维而已
- 求答案就直接枚举就好了
代码
1 #include<stdio.h> 2 #define ll long long 3 using namespace std; 4 #define INF 1000000000 5 int n,m,q; 6 int dis[60][60][1010]; 7 int main() 8 { 9 scanf("%d%d",&n,&m); 10 for (int l=1;l<=m;l++) for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) dis[i][j][l]=INF; 11 for(int i=1;i<=m;i++) 12 { 13 ll a,b,w; 14 scanf("%lld%lld%lld",&a,&b,&w); 15 if(dis[a][b][1]>w) dis[a][b][1]=w; 16 } 17 for (int l=2;l<=m;l++) 18 for (int k=1;k<=n;k++) 19 for (int i=1;i<=n;i++) 20 for (int j=1;j<=n;j++) if(dis[i][j][l]>dis[i][k][l-1]+dis[k][j][1]) dis[i][j][l]=dis[i][k][l-1]+dis[k][j][1]; 21 scanf("%d",&q); 22 while (q--) 23 { 24 int x,y; 25 double ans=INF,min=INF; 26 scanf("%d%d",&x,&y); 27 for (int l=1;l<=n;l++) 28 { 29 if (dis[x][y][l]<INF) ans=double(dis[x][y][l])/double(l); 30 if (ans<min) min=ans; 31 } 32 if (min==INF) printf("OMG!\n"); else printf("%.3lf\n",min); 33 } 34 }