边的权为不被抓住的概率,注意是概率,需要求的是能逃跑的最大可能 这题与一般的最短路不同,体现在权值上 所以把一般权值的相加改成相乘,利用floyed的算法框架求解 另外注意精度 #include<stdio.h> #include<string.h> #define MAXN 101 double map[MAXN][MAXN]; //边权用浮点数存 int n, m; void floyed(){ for(int k = 0; k < n; ++k) for(int i = 0; i < n; ++i){ if(i == k) continue; for(int j = 0; j < n; ++j){ if(j == i || j == k) continue; if(map[i][k] * map[k][j] > map[i][j] && map[i][k] && map[k][j]) map[i][j] = map[i][k] * map[k][j]; } } } int main(){ while(scanf("%d",&n) == 1, n){ scanf("%d",&m); int a, b; double w; for(int i = 0; i <= n; ++i) for(int j = 0; j <= n; ++j) map[i][j] = 0; memset(map, 0.0, sizeof(map)); for(int i = 0; i < m; ++i){ scanf("%d%d%lf",&a, &b, &w); map[a - 1][b - 1] = map[b - 1][a - 1] = 0.01 * w; } floyed(); printf("%.6lf percent/n",map[0][n - 1] * 100); } return 0; }