level 7
自信682
楼主
help
a参数必须是对称矩阵,且对角线为inf,a矩阵的构造:有n个点第i个点到第j个点的距离a[i-1,j-1]的值
最后打印第一个点到各个点的最短路径和距离
endh
function zuiduanlu(a)
//function zuiduanlu()
//variable a=[[inf,2,3,4,5],[2,inf,7,8,9],[3,7,inf,45,7],[4,8,45,inf,34],[5,7,7,34,inf]]
//variable a=[[inf,50,inf,40,25,10],[50,inf,15,20,inf,25],[inf,15,inf,10,20,inf],[40,20,10,inf,10,25],[25,inf,20,10,inf,55],[10,25,inf,25,55,inf]]
variable pb=zeros(size(a)[0]),index1=0,index2=zeros(size(a)[0]),d=zeros(size(a)[0]),temp=0,tb
variable dtb=[],mina,temp2,tmpb
pb[0]=1
d=xiugai(d,find(d,"==",0),inf)
d[0]=0
while dprod(pb,ones(size(pb)[0]))<size(a)[0]
tb=find(pb,"==",0)
for variable ii=0 to size(tb)[0]-1
d[tb[ii]]=min(d[tb[ii]],d[temp]+a[temp, tb[ii]])
next
dtb=xunxb(d,tb)
mina=xiangliang_min(dtb)
temp=tb[mina[1]]
pb[temp]=1
if size(index1)==[]
index1=set_array_elem([],0,index1)
endif
index1=set_array_elem(index1,size(index1)[0],temp)
for variable kk=0 to size(index1)[0]-1
if d[index1[kk]]==d[temp]-a[temp,index1[kk]]
temp2=kk
break
endif
next
index2[temp]=index1[temp2]
loop
variable s="",as,b
for as=0 to size(index2)[0]-1
s=tostring(as)
b=index2[as]
s=tostring(b)+"->"+s
while b!=0
b=index2[b]
s=tostring(b)+"->"+s
loop
print("路径:"+s+" "+"路径长度:"+d[as]+"\n")
next
endf
function xiangliang_min(x)
variable a=inf,b=-1,ii
for ii=0 to size(x)[0]-1
if a>x[ii]
a=x[ii]
b=ii
endif
next
return([a,b])
endf
//xunxb(allay,xb) 返回数组allay的下标对应数组
function xunxb(ar,xb)
variable a=[],ii
for ii=0 to size(xb)[0]-1
a=set_array_elem(a,size(a)[0],fanxb(ar,xb[ii]))
next
return(a)
endf
function fanxb(a,x) //返回a的下标x的值
if size(x)==[]
x=set_array_elem([],0,x)
endif
if and(size(size(a))!=size(x),size(x)!=[])
print("参数维数不同!")
return
endif
variable b=a,ii
for ii=0 to size(x)[0]-1
b=b[x[ii]]
next
return(b)
endf
help
函数原型为find(矩阵或向量A,逻辑操作符$,数值num)
返回A中满足逻辑操作符的与数值比较的下标
例如:find(A,"<",0)返回A中小于0的数的下标数组
操作符支持:<,>,<=,>=,==,!= 注意用文本
endh
function find(array,Ro,num)
//function find()
//variable array=[[0,1,1,0],[1,2,3,0]],ro="==",num=0
variable a=size(array),b=[]
//未检验array的类型
select size(a)[0]
case 1
for variable ii=0 to a[0]-1
if panduan(array[ii],ro,num)
b=set_array_elem(b,size(b)[0],ii)
endif
next
break
case 2
for variable ii=0 to size(array)[0]-1
for variable jj=0 to size(array)[1]-1
if panduan(array[ii,jj],ro,num)
b=set_array_elem(b,size(b)[0],[ii,jj])
endif
next
next
ends
//print(b)
return(b)
endf
function panduan(x,s,num)
select s
case "<"
return x<num
case "<="
return x<=num
case ">"
return x>num
case ">="
return x>=num
case "!="
return x!=num
case "=="
return x==num
case "="
return x==num
ends
endf
function xiugai(ar,xb,zhi)
//将数组或向量的下标数组对应的值修改成zhi
//检验数组ar与xb的对应性
variable ws=size(size(ar)),xbws=size(size(xb))
if ws!=xbws
print("数组下标与下标参数不同")
return
endif
for variable ii=0 to size(xb)[0]-1
ar=set_array_elem(ar,xb[ii],zhi)
next
//print(ar)
return(ar)
endf
2016年03月05日 04点03分
1
a参数必须是对称矩阵,且对角线为inf,a矩阵的构造:有n个点第i个点到第j个点的距离a[i-1,j-1]的值
最后打印第一个点到各个点的最短路径和距离
endh
function zuiduanlu(a)
//function zuiduanlu()
//variable a=[[inf,2,3,4,5],[2,inf,7,8,9],[3,7,inf,45,7],[4,8,45,inf,34],[5,7,7,34,inf]]
//variable a=[[inf,50,inf,40,25,10],[50,inf,15,20,inf,25],[inf,15,inf,10,20,inf],[40,20,10,inf,10,25],[25,inf,20,10,inf,55],[10,25,inf,25,55,inf]]
variable pb=zeros(size(a)[0]),index1=0,index2=zeros(size(a)[0]),d=zeros(size(a)[0]),temp=0,tb
variable dtb=[],mina,temp2,tmpb
pb[0]=1
d=xiugai(d,find(d,"==",0),inf)
d[0]=0
while dprod(pb,ones(size(pb)[0]))<size(a)[0]
tb=find(pb,"==",0)
for variable ii=0 to size(tb)[0]-1
d[tb[ii]]=min(d[tb[ii]],d[temp]+a[temp, tb[ii]])
next
dtb=xunxb(d,tb)
mina=xiangliang_min(dtb)
temp=tb[mina[1]]
pb[temp]=1
if size(index1)==[]
index1=set_array_elem([],0,index1)
endif
index1=set_array_elem(index1,size(index1)[0],temp)
for variable kk=0 to size(index1)[0]-1
if d[index1[kk]]==d[temp]-a[temp,index1[kk]]
temp2=kk
break
endif
next
index2[temp]=index1[temp2]
loop
variable s="",as,b
for as=0 to size(index2)[0]-1
s=tostring(as)
b=index2[as]
s=tostring(b)+"->"+s
while b!=0
b=index2[b]
s=tostring(b)+"->"+s
loop
print("路径:"+s+" "+"路径长度:"+d[as]+"\n")
next
endf
function xiangliang_min(x)
variable a=inf,b=-1,ii
for ii=0 to size(x)[0]-1
if a>x[ii]
a=x[ii]
b=ii
endif
next
return([a,b])
endf
//xunxb(allay,xb) 返回数组allay的下标对应数组
function xunxb(ar,xb)
variable a=[],ii
for ii=0 to size(xb)[0]-1
a=set_array_elem(a,size(a)[0],fanxb(ar,xb[ii]))
next
return(a)
endf
function fanxb(a,x) //返回a的下标x的值
if size(x)==[]
x=set_array_elem([],0,x)
endif
if and(size(size(a))!=size(x),size(x)!=[])
print("参数维数不同!")
return
endif
variable b=a,ii
for ii=0 to size(x)[0]-1
b=b[x[ii]]
next
return(b)
endf
help
函数原型为find(矩阵或向量A,逻辑操作符$,数值num)
返回A中满足逻辑操作符的与数值比较的下标
例如:find(A,"<",0)返回A中小于0的数的下标数组
操作符支持:<,>,<=,>=,==,!= 注意用文本
endh
function find(array,Ro,num)
//function find()
//variable array=[[0,1,1,0],[1,2,3,0]],ro="==",num=0
variable a=size(array),b=[]
//未检验array的类型
select size(a)[0]
case 1
for variable ii=0 to a[0]-1
if panduan(array[ii],ro,num)
b=set_array_elem(b,size(b)[0],ii)
endif
next
break
case 2
for variable ii=0 to size(array)[0]-1
for variable jj=0 to size(array)[1]-1
if panduan(array[ii,jj],ro,num)
b=set_array_elem(b,size(b)[0],[ii,jj])
endif
next
next
ends
//print(b)
return(b)
endf
function panduan(x,s,num)
select s
case "<"
return x<num
case "<="
return x<=num
case ">"
return x>num
case ">="
return x>=num
case "!="
return x!=num
case "=="
return x==num
case "="
return x==num
ends
endf
function xiugai(ar,xb,zhi)
//将数组或向量的下标数组对应的值修改成zhi
//检验数组ar与xb的对应性
variable ws=size(size(ar)),xbws=size(size(xb))
if ws!=xbws
print("数组下标与下标参数不同")
return
endif
for variable ii=0 to size(xb)[0]-1
ar=set_array_elem(ar,xb[ii],zhi)
next
//print(ar)
return(ar)
endf
