动态规划——弗洛伊德矩阵路径问题

59 阅读1分钟
void Floyd(int arc[][10], int dist[][10], int n)
{
    int i, j, k;
    for (i = 0; i < n; i++) //初始化矩阵dist
    {
        for (j = 0; j < n; j++)
        {
            dist[i][j] = arc[i][j];
        }
    }
    for (k = 0; k < n; k++) //将k放在外层,进行n次迭代
    {
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
            {
                if (dist[i][k] + dist[k][j] < dist[i][j])
                    dist[i][j] = dist[i][k] + dist[k][j];
            }
        }
    }
    cout << endl;
    for (i = 0; i < n; i++) //输出计算完成的所有点对之间的最短路径
        for (j = 0; j < n; j++)
            cout << dist[i][j] << "  ";
}
int main()
{
    int arc[10][10];  //代价矩阵arc[n][n]储存邮箱边上的权值
    int dist[10][10]; //数组dist[n][n]存放在迭代过程中求得的最短路径长度
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            cin >> arc[i][j]; //输入各个点之间的距离
            if (arc[i][j] == -1)
                arc[i][j] = INF;
        }
    }
    Floyd(arc, dist, 3); //调用Floyd函数进行求解
    return 0;
}