- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE \* MERGEFORMAT6
通信网理论基础实验三、实验四代码分析
24班 曹爽 2013210640
实验三:Floyd算法
代码说明:
首先输入顶点个数和边的个数(指有向边的个数,比如从1到2和从2到1是不一样的,算作两条有向边),确定问题规模。
之后输入各边起点、终点和权值,顶点名称默认为0、1、2……如从1到2的权值为3,则输入1[空格] 2[空格] 3[回车]。由于我采用的是有向图,因此从1到2和从2到1是不同的,需要输入两次。
待所有起点、终点和权值都输入完毕之后,整个图就建立完毕了。我没有采用输入邻接矩阵的形式,是考虑到有些点对之间可能没有边连接,此时即便用户输入一个很大的权值,也有可能被其他路径的权值之和超过,造成结果出错。并且如果邻接矩阵是一个稀疏矩阵,输入很多0也是不必要的。因此我采用起点、终点和权值逐个输入的方式,对于没有边连接的部分,全部赋值为INF(0xfffffff),省去了逐个输入的麻烦。
之后输入要查询的起点和终点,利用Floyd算法即可计算出最短路径的权值,并且打印出最短路径;如果起点和终点没有路径连通,则返回找不到对应路径。
代码注释:
#includeiostream
#define INF 0xfffffff //设置INF作为没有边时的赋值
using namespace std;
int **dist,**path;
int main()
{
int n,T;
int i,j,k;
int a,b,v;
int start,finish,temp;
cout请输入顶点个数:;
cinn;
dist=new int* [n];
path=new int* [n];
for(i=0;in;i++) //根据顶点个数建立矩阵
{
dist[i]=new int [n];
path[i]=new int [n];
}
for(i=0;in;i++)
{
for(j=0;jn;j++)
dist[i][j]=INF; //先将全部元素赋值为INF
}
for(i=0;in;i++)
dist[i][i]=0; //每个点到自身的连接设置为0(矩阵对角线为0)
cout请输入边的个数:;
cinT;
cout请输入各边起点、终点与权值:(顶点名称默认为0,1,……,n-1)endl;
while(T0)
{
cinabv;
dist[a][b]=v; //根据有向边的个数和用户输入来设置权值
T--;
}
for(i=0;in;i++) //Floyd算法
{
for(j=0;jn;j++)
{
if(dist[i][j]==INF)
path[i][j]=0;
else
path[i][j]=j;
}
}
for(k=0;kn;k++)
{
for(i=0;in;i++)
{
for(j=0;jn;j++)
{
if(dist[i][j]dist[i][k]+dist[k][j])
{
dist[i][j]=dist[i][k]+dist[k][j];
path[i][j]=path[i][k];
}
}
}
}
cout请输入要查询的起点和终点:;
cinstartfinish;
if(dist[start][finish]!=INF) //判断起点终点之间是否连通
{ //若连通,则给出最短路径权值和具体路径方式
cout最短路径为:dist[start][finish]endl;
cout具体路径为:endl;
temp=start;
while(temp!=finish)
{
couttemp-;
temp=path[temp][finish];
}
coutfinishendl;
}
else
cout找不到对应路径endl; //若不连通,返回找不到具体路径
return 0;
}
测试结果:
选择一个有4个顶点(编号为0、1、2、3)和6条有向边的图,分别输入起点、终点和权值如下图所示。之后测试从0到2的最短路径。从数据可以看出,从0到2有三条路径:
① 0到1、1到2,权值为1+1=2;
② 0到2,权值为3;
③ 0到3、3到2,权值为1+3=4。
按照Floyd算法,应该选择权值为2的路径①作为最短路径。实验结果与预期相符
实验四:图的连通性判断
代码说明:
判断图的连通性,只需要判断途中任意两个节点是否能通过某种路径(依然采用有向的路径)到达即可。
您可能关注的文档
最近下载
- 2025年人工智能与机器学习课程期末考试题及答案.docx VIP
- 雪迪龙 SCS-900UV使用说明书.pdf VIP
- 2026中国电科36所校园招聘考试模拟卷及答案解析(夺冠).docx VIP
- 古代诗人名人王维人物介绍PPT.pptx VIP
- 温州市2026届高三第一次适应性考试(一模)语文试卷(含答案详解)原卷.pdf
- EXCEL上机操作题.doc VIP
- 贵州兴义电力发展有限公司2026年校园招聘备考题库及答案详解参考.docx VIP
- 金属材料学 戴起勋 上传完整版.doc VIP
- 心率变异性分析评价糖尿病患者自主神经病变应用.doc VIP
- 道路旅客运输企业安全生产操作规程汇编 .pdf VIP
原创力文档


文档评论(0)