程序如下:(是函数形式的)
function d=juli(a)
[p,r]=size(a)
for k=1:p
for m=1:p
for n=1:p
if(a(m,n)>a(m,k)+a(k,n))
a(m,n)=a(m,k)+a(k,n)
end
end
end
end
d=a
2、根据距离矩阵求出任两点经过该点的最短距绝裂拿离,用矩阵表示
程序如下(输入是距离矩阵和顶点编号)
function d1=jingguo(d,s)
d1=d
[m,n]=size(d)
for x=1:m
for y=1:m
d1(x,y)=d(x,s)+d(s,y)
d1(y,x)=d(x,s)+d(s,y)
end
end
怎么调用函数这些你知道吧,源让不知道再问我吧
你的代码我自己重新写了一遍,字母换了但字母顺序没有换
你的问题在于出现了重复累加的情况,举例:
显而易见3条路,原代码计算结果为5,因为(k1,k2,k)在(1,7,5),(1,5,2),(1,5,3),(1,7,6),(1,6,4)的时候各增加了一次可以看出多增加了两次(因为1257和1467这条两路在第二轮判断时各多加了一次),实际上每次处理过循环之后,都会多加一次,因此我加入判断变量k0,只要循环巧悄中内经过递归,那么结束时就会减一(如k1=1,k2=5时,实际上此时已经加过一次,在k=2,3时又加了两次,此时就需要减掉一次)
感谢题主的思孝山路,手头在做介数中心性,之前一直在考虑生成所有最短路径的矩阵,但计算规模巨大,远不运樱如这种方法简单
function n=fun2(k1,k2,G,D)
%求最短路径数目
%k1表示第一个点,k2表示第二个点,D表示距离矩阵
num=size(G,1)
n=0
k0=false
for k = 1:num
if G(k,k2)&&D(k1,k2)==D(k1,k)+D(k,k2)%如果第k个点直接连通到k2且为k1,k2必经之点,则进入递归
n = n + fun2(k1,k,G,D)
k0=true %如果循环内出现了递归则记为true
end
end
if k0,n=n-1end %排除重复增加
n=n+1
end
运行:
G=[false,true,true,true,false,false,falsetrue,false,false,false,true,false,falsetrue,false,false,false,true,false,falsetrue,false,false,false,false,true,falsefalse,true,true,false,false,false,truefalse,false,false,true,false,false,truefalse,false,false,false,true,true,false]
k1=1k2=7
D=[NaN,1,1,1,2,2,31,NaN,2,2,1,3,21,2,NaN,2,1,3,21,2,2,NaN,3,1,22,1,1,3,NaN,2,12,3,3,1,2,NaN,13,2,2,2,1,1,NaN]
n=fun2(k1,k2,G,D)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)