全球旧事资料 分类
图论算法及其MATLAB程序代码求赋权图GVEF中任意两点间的最短路的WarshallFloyd算法:设Aaij
×
为赋权图GVEF的矩阵当vivj∈E时aijFvivj否则取aii0aij∞i≠jdij表示从vi到vj点的距离rij表示从vi到vj点的最短路中一个点的编号①赋初值对所有ijdijaijrijjk1转向②②更新dijrij对所有ij若dikdkj<dij则令dijdikdkjrijk转向③③终止判断若dii<0则存在一条含有顶点vi的负回路终止或者k
终止否则令kk1转向②最短路线可由rij得到例1求图64中任意两点间的最短路解:用WarshallFloyd算法MATLAB程序代码如下:
8A0281I
fI
fI
fI
f206I
f1I
fI
fI
f8607512I
f1I
f70I
fI
f9I
fI
f15I
f03I
f8I
fI
f1I
f3046I
fI
f29I
f403I
fI
fI
fI
f8630MATLAB中I
f表示∞DA赋初值fori1
forj1
Rijje
de
d赋路径初值fork1
fori1
forj1
ifDikDkjDijDijDikDkj更新dijRijke
de
de
d更新rijk显示迭代步数D显示每步迭代后的路长R显示每步迭代后的路径pd0fori1
含有负权时ifDii0pd1breake
de
d存在一条含有顶点vi的负回路ifpdbreake
d存在一条负回路终止程序e
d程序结束图64
Kruskal避圈法:将图G中的边按权数从小到大逐条考察按不构成圈的原则加入到T中若有选择时不同的选择可能会导致最后生成树的权数不同直到qTpG1为止即T的边数G的顶点数1为止Kruskal避圈法的MATLAB程序代码如下:
8A0281000020601000860751201070009001500308001030460029040300008630k1记录A中不同正数的个数
ffori1
1forji1
此循环是查找A中所有不同的正数ifAij0xkAij数组x记录A中不同的正数kk1临时变量fors1k1ifxkxskk0breake
de
d排除相同的正数kkkke
de
de
dkk1显示A中所有不同正数的个数fori1k1forji1k将x中不同的正数从小到大排序ifxjxixxxjxjxixixxe
de
de
dT
0将矩阵T中所有的元素赋值为0q0记录加入到树T中的边数fors1kifq
breake
d获得最小生成树T算法终止fori1
1forji1
ifAijxsTijxsTjixs加入边到树T中TTT临时记录Twhile1pd1砍掉TT中所有的树枝fory1
kk0forz1
ifTTyz0kkkk1zzze
de
d寻找TT中的树枝ifkk1TTyzz0TTzzy0pd0e
de
d砍掉TT中的树枝ifpdbreake
de
d已砍掉了TT中所有的树枝pd0判断TT中是否有圈fory1
1forzy1
ifTTyz0pd1breake
de
de
difpdTij0Tji0假如TT中有圈elseqq1e
de
de
de
de
dr
好听全球资料 返回顶部