下列代码试图实现 Floyd 算法求所有点对之间的最短路径,横线处应填入( )。
void floyd(int n, int dist[][MAXN]) {
for (int k = 0; k < n; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (___________ ) // 在此处填入选项
dist[i][j] = dist[i][k] + dist[k][j];
}位运算:&(与)、|(或)、^(异或)、~(取反)、<<(左移)、>>(右移)。异或性质:a^a=0,a^0=a。
区分逻辑运算(&&,||,!)和位运算(&,|,~,!)。左移右移注意符号位的处理(算术右移vs逻辑右移)。负数的位运算要小心。
【考点】动态规划(Floyd 算法)|状态转移与不可达处理|三重循环结构
GESP 八级明确要求掌握 Floyd 算法求全源最短路。命题人专门出这道题,就是要卡住大量考生对 Floyd 核心条件理解不清的弱点——很多人只会背dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]),却忘了在只有if语句时,必须同时保证路径可达且更优。