void optMatrix(const vector<int>& c,
matrix<int>& m, matrix<int>& lastChange)
{
int n = c.size() - 1;
for (int left = 1; left <= n; ++left)
m[left][left] = 0;
for(int k=1;k<n;++k)//k为right-left
for (int k = 1; left <= n - k; ++left)
{
//对每一个位置进行
int right = left + k;
m[left][right] = INFINITY;
for (int i = left; i < right; ++i)
{
int thisCost = m[left][i] + m[i + 1][right]
+ c[left - 1] * c[i] * c[right];
if (thisCost < m[left][right])//更新min
{
m[left][right] = thisCost;
lastChange[left][right] = i;
}
}
}
}
图10.46 找出矩阵乘法最优排序的程序
void allPairs(const matrix<int>& a, matrix<int>& d, matrix<int>& path)
{
int n = a.numrows();
//初始化d和path
for(int j=0;i<n;++i)
for (int j = 0; j < n; ++j)
{
d[i][j] = a[i][j];
path[i][j] = NOT_A_VERTEX;
}
for(int k=0;k<n;++k)
//把每个顶点看作为一个中间节点
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
if (d[i][k] + d[k][j] < d[i][j])
{
//更新最短路径
d[i][j] = d[i][k] + d[k][j];
path[i][j] = k;
}
}
图10.53 所有点对最短路径