//最优最短路径
//Dijkstra(迪杰斯特拉)一个顶点到其余各顶点的最短路径O(n^2)
//Floyd(弗洛伊德)任意两顶点的最小路径 O(n^3)
void Dijkstra(MGraph g,int v,int dist[],int path[])
{
int set[maxSize];
int min,i,j,u;
//初始化
for(i=1;i<=g.n;i++)
{
dist[i]=g.edges[v][i];
set[i]=0;
if(g.edges[v][i]<INF)
path[i]=v;
else
path[i]=-1;
}
set[v]=1;
path[v]=-1;
//关键操作
for(i=1;i<=g.n;i++)
{
min=INF;
for(j=1;j<=g.n;j++)
{
if(set[j]==0 && dist[j]<min)
{
u=j;
min=dist[j];
}
}
set[u]=1;//找最短加入
//判断新加入的中转是否更短
for(j=1;j<=g.n;j++)
{
if(set[j]==0 && dist[u]+g.edges[u][j]<dist[j])
{
dist[j]=dist[u]+g.edges[u][j];
path[j]=u;
}
}
}
}//最后dist[]存放V到其余的最短路径“长度”,path存放最短路径。
//弗洛伊德
//1:中转点K
//2:划出第K行,第K列
//3:第K列每一个数与第K行相加,与该数所在行对应的数比较,小于则改,且改PATH为K
void Floyd(MGraph g,int A[][maxSize],int Path[][maxSize])
{
int i,j,k;
//初始化
for(i=0;i<g.n;i++)
{
for(j=0;j<g.n;j++)
{
A[i][j]=g.edges[i][j];
Path[i][j]=-1;
}
}
//以K为中间节点对{i,j}进行检测和修改
for(k=0;k<g.n;k++)
{
for(i=0;i<g.n;i++)
for(j=0;j<g.n;j++)
if(A[i][j]>A[i][k]+A[k][j])
{
A[i][j]=A[i][k]+A[k][j];
Path[i][j]=k;
}
}
}
最优最短路径,迪杰斯特拉和弗洛伊德
最新推荐文章于 2023-04-16 11:30:14 发布