题解
- 设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!
"); else printf("%.3lf
",min);
33 }
34 }