题目链接请戳 这里
解题思路
需要知道floyd的动态规划思想.
需要注意的是这里无法用滚动数组来压缩空间。
因为需要每次和现在情况作比较,而不是仅仅和过去作比较。
要保存路径的话,再加个path数组,打印就类似于动态规划的路径打印。
代码
#include<stdio.h> #include<string.h> #define N 30 double d[N][N][N]; int n, now, path[N][N][N]; void print_path(int x, int y, int s) { if (s != 1) print_path(x, path[s][x][y], s-1); printf("%d ", path[s][x][y]); } void floyd() { int k; now = 0; for (k = 2; k <= n; k++) { for (int p = 1; p <= n; p++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (d[k-1][i][p] * d[1][p][j] > d[k][i][j]) { d[k][i][j] = d[k-1][i][p] * d[1][p][j]; path[k][i][j] = p; } } } } for (int i = 1; i <= n; i++) if (d[k][i][i] > 1.01) { now = i; break; } if (now != 0) break; } if (k > n) printf("no arbitrage sequence exists\n"); else { // printf("%d\n", k); print_path(now, now, k); printf("%d\n", now); } } int main() { while (~scanf("%d", &n)) { memset(d, 0, sizeof(d)); memset(path, 0, sizeof(path)); for (int i = 1; i <= n; i++) { for (int j = 1; j <=n; j++) if (i != j) { scanf("%lf", &d[1][i][j]); path[1][i][j] = i; } } floyd(); } return 0; }