作业2

1.问题
运用Floyd算法、Dijkstra算法寻找最短路径
2.解析
Floyd:首先把初始化距离数组作为图的邻接矩阵,路径数组初始化为-1。其中对于邻接矩阵中的数首先初始化为正无穷,如果两个顶点存在边则初始化为权重。对于每一对顶点u和v,看看是否存在一个顶点使得u到该顶点再到v比已知的路径更短。如果是就更新它。即如果 dist[i][k]+dist[k][j] < dist[i][j],则dist[i][j] = dist[i][k]+dist[k][j]

Dijkstra:指定起点s,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是"起点s到该顶点的路径"。然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。 然后,再从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。 … 重复该操作,直到遍历完所有顶点。

3.设计
Floyd:
bool Floyd(){
for(int k = 1 ; k < this->Nv+1 ; k++){
for(int i = 1 ; i < this->Nv+1 ; i++){
for(int j = 1 ; j < this->Nv+1 ; j++){
if(this->dist[i][k] + this->dist[k][j] < this->dist[i][j]){
this->dist[i][j] = this->dist[i][k] + this->dist[k][j];
if(i == j && this->dist[i][j] < 0)
return false;
this->path[i][j] = k;
}
}
}
}
return true;
}
Dijkstra:
void dijkstra(int s){
bool done[maxn];
int dis[maxn];
for(int i=0;i<=n;i++){
dis[i] = INF;
done[i] =false;
}
dis[s] = 0;
s_node u(s,0);
priority_queue<s_node> Q;
Q.push(u);
while(!Q.empty()){
u = Q.top();
Q.pop();
if(done[u.id]) continue;
done[u.id]=true;
for(int i=0;i<e[u.id].size();i++){
edge v=e[u.id][i];
if(done[v.to]) continue;
if(dis[v.to]>dis[v.from]+v.value){
dis[v.to] = dis[v.from] + v.value;
Q.push(s_node(v.to,dis[v.to]));
pre[v.to] = pre[v.from];
}
}
}
for(int i=1;i<=n;i++)
printf(“i:%d dis:%d\n”,i,dis[i]);
cout<<endl;
}
4.分析
[算法复杂度推导]
5.源码
https://github.com/kukukiki11/-/blob/main/Floyd.cpp
https://github.com/kukukiki11/-/blob/main/Dijkstra.cpp

上一篇:shell脚本——for和while之间的区别


下一篇:Bash 脚本 逐行处理文本文件的内容