Floyd方法真是简洁,时间复杂度是O(n^3),是所有顶点之间的最短路径
Dijkstra求的是源点到其它点之间的最短路径,如果要求所有点之间的最短路径,时间复杂度还是O(n^3)
const int maxint = 65535;
const int maxnum = 10;
int dist[maxnum];
int prev[maxnum];
int a[maxnum][maxnum];
void Dijkstra(int v0)
{
bool s[maxnum];
int n = maxnum;
for(int i = 0; i <= n; i++)
{
dist[i] = a[v0][i];
s[i] = false;
if(dist[i] == maxint)
prev[i] = -1;
else
prev[i] = v0;
}
dist[v0] = 0;
s[v0] = true;
for(int i = 2; i <= n; i++)
{
int mindist = maxint;
int u = v0;
for(int j = 1; j <= n; j++)
if((!s[j]) && dist[j] < mindist)
{
u = j;
mindist = dist[j];
}
s[u] = true;
for(int j = 1; j <= n; j++)
if((!s[j]) &&a[u][j] < maxint)
{
if(dist[u] + a[u][j] < dist[j])
{
dist[j] = dist[u] + a[u][j];
prev[j] = u;
}
}
}
}
void flod(mygraph t)
{
int mat[num][num];
int path[num][num];
int n = t.nodes;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
mat[i][j] = t.edges[i][j];
path[i][j] = j;
}
for(int k = 0; k < n; k++)
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
if(mat[i][j] > (mat[i][k] + mat[k][j]))
{
path[i][j] = k;
mat[i][j] = mat[i][k] + mat[k][j];
}
}