1.问题
用Floyd、Dijkstra算法求解下图各个顶点的最短距离
2.解析
用Floyd算法求解题一,我们用三重循环进行判断,当然我们可以进行相应的减枝,不用对无效的数据即没有连通的点算最短距离。
用Dijkstra算法求解题二,我们可以用优先队列优化问题,获取最短边的时候可以降低复杂度,因为题目给的点是以字母的形式给出的,我们可以用映射的方法将字母映射为数字。
3.设计
Floyd算法:
void Floyd(){
for (int i=1;i<=n;++i){
for (int j=1;j<=n;++j){
for(int k =1;k<=n;++k){
if(g[j][k]>g[j][i]+g[i][k]){
g[j][k]=g[j][i]+g[i][k];
}
}
}
}
}
Dijkstra算法:
int djs(graph g,int e,int v){
int dst[Len];
int st;
int mixn;
for (int i=0;i<g->nv;++i){
dst[i]=g->data[e][i];
}
for (int i=0;i<g->nv;++i){
mixn=INF;
for (int j=0;j<g->nv;++j){
if(g->visited[j]==0&&dst[j]<mixn){
st=j;
mixn=dst[j];
}
}
g->visited[st]=1;
for (int j=0;j<g->nv;++j){
if(g->visited[j]==0&&dst[j]>dst[st]+g->data[st][j]){
dst[j]=dst[st]+g->data[st][j];
}
}
}
return dst[v];
}
4.分析
Floyd:通过三个循环遍历每一个节点,时间复杂度约为O(V3)
Dijkstra:未使用堆优化,通过循环来遍历节点,时间复杂度约为O(V(V+V)),为O(V2)