算法分析实验二

实验报告

课程名称 《算法分析与设计》 实验日期 2020年 3 月 15 日 至 2020 年 3 月 15 日
学生姓名 林泓佺 所在班级 计算机193 学号 20019212212088
实验名称 最短路
实验地点 勤园13号楼208 同组人员 林泓佺

1.问题
[用Floyd算法求解下图各个顶点的最短距离。写出Floyd算法的伪代码和给出距离矩阵(顶点之间的最短距离矩阵),按实验报告模板编写算法。

对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径,按实验报告模板编写算法。

]
2.解析

[floyd算法:
1,从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。
2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短。如果是更新它。

dijkstra算法:
(1) 初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为"起点s到该顶点的距离"[例如,U中顶点v的距离为(s,v)的长度,然后s和v不相邻,则v的距离为∞]。
(2) 从U中选出"距离最短的顶点k",并将顶点k加入到S中;同时,从U中移除顶点k。
(3) 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。
(4) 重复步骤(2)和(3),直到遍历完所有顶点。

]
3.设计
[floyd算法:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
const int INF=1e8+10;
map<int,int>mp[maxn];
int main() {
int n,m;
cin>>n>>m;
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++){
if(i==j)mp[i][j]0;
else mp[i][j]=INF;
}
}
for(int i=1;i<=m;i++){
int a,b,c;
cin>>a>>b>>c;
mp[a][b]=c;
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
mp[i][j]=min(mp[i][k]+mp[k][j],mp[i][j]);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<“V”<<i<<"->"<<“V”<<j<<" dis:"<<mp[i][j]<<endl;
}
}
}
dijkstra算法:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
const int INF=1e8+10;
int vis[maxn];
int dis[maxn];
int mp[maxn][maxn];
int n,m;
void dijkstra() {
memset(vis,0,sizeof(vis));
for(int i=1; i<=n; i++) {
dis[i]=INF;
}
dis[1]=0;
vis[1]=1;
int k;
for(int i=1; i<=n; i++) {
int minn=INF;
for(int j=1; j<=n; j++) {
if(!vis[j]&&minn>dis[j]) {
k=j;
minn=dis[j];
}
}
vis[k]=1;
for(int j=1; j<=n; j++) {
if(!vis[j]&&dis[j]>dis[k]+mp[k][j]) {
dis[j]=dis[k]+mp[k][j];
}
}
}
}
int main() {
cin>>n>>m;
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(i
j)mp[i][j]=1;
else mp[i][j]=INF;
}
}
for(int i=0; i<m; i++) {
int a,b,c;
cin>>a>>b>>c;
mp[a][b]=c;
}
dijkstra();
cout<<dis[n]<<endl;
}
]
4.分析
[folyd算法复杂度:O(n3)
简单dijkstra算法复杂度:O(n2)]
5.源码
[github源码地址:https://github.com/lhqbalabala/sf3.15]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值