求有向图的传递闭包的warshall算法和计算全部最短路径的floyd算法,他们在本质上都是基于相同的思想,而且都是动态规划的一个应用方面.
#include <iostream>
using namespace std;
const int MAX=65532;
int a[4][4]={{0,1,0,0},{0,0,0,1},{0,0,0,0},{1,0,1,0}};
int b[4][4]={{0,MAX,3,MAX},{2,0,MAX,MAX},{MAX,7,0,1},{6,MAX,MAX,0}};
void warshall(int a[4][4])
{
for(int k=0;k<4;k++)
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
//if(a[i][j]==0)
//{
a[i][j]=a[i][j]|a[i][k]&a[k][j];
//}
}
}
void floyd(int a[4][4])
{
for(int k=0;k<4;k++)
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
//if(a[i][j]==0)
//{
a[i][j]=a[i][j]<(a[i][k]+a[k][j])?a[i][j]:a[i][k]+a[k][j];
//}
}
}
int main()
{
//warshall(a);
floyd(b);
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
printf("%d ",b[i][j]);
printf("/n");
}
}