floyd算法 floyd算法是什么意思

办公技巧 2024-07-25 09:49:59

大神们啊 跪求Bellman-Ford算法的通用matlab程序 要直接粘贴就能跑动的

给出矩阵,其中矩阵A是邻接矩阵,而矩阵Path记录u,v两点之间短路径所必须经过的点

%floif(k!=0)yd.m

floyd算法 floyd算法是什么意思floyd算法 floyd算法是什么意思


{char vertex[VertexNum]; //顶点表

% %采用floyd算法计算图中任意两点之间短路程,可以有负权。

%参数D为连通图的权矩阵

%R是路由矩阵

D=A; n=length(D); %赋初值

for(i=1:n)for(j=1:n)R(i,j)=j;end;end %赋路径初值

for(k=1:n)

for(i=1:n)

for(j=1:n)

if(D(i,k)+D(k,j)

R(i,j)=k;end;end;end %更新rij,需要通过k

D; %显示每步迭代后的路长

R; %显示每步迭代后的路径

pd=0;for i=1:n %含有负权时

if(D(i,i)<0)pd=1;break;end;end %跳出内层的for循环 存在一条含有顶点vi的负回路

if(pd==1) fprintf('有负回路');break;end %存在一条负回路, 跳出外层循环 终止程序

end %程序结束

function [d,path]=dijkstra(W,s,t)

[n,m]=size(W);ix=(W==0);W(ix)=inf;

if(n~=m),error('Square W requred');end

visited(1:n)=0;dist(1:n)=inf;parent(1:n)=0;dist(s)=0;d=inf;

for i=1:(n-1),

[a,u]=min(vec);visited(u)=1;

for v=1:n,if(W(u,v)+dist(u)

dist(v)=dist(u)+W(u,v);parent(v)=u;

end;end;end;

if(parent(t)~=0),path=t;d=dist(t);

while(t~=s),p=parent(t);path=[p path];t=p;end;

end;

用编写的floyd算法求两点间的短路径,怎么输出path经过的顶点序列?

function [D,R]= floydwarshall(A)

Function Min(x() as integer,y() as integer) as double

用Dijkstra算法找出以A为起点的单源短路径步骤如下

dim i,j,k,a

function [d,r]=floyd(a)

dim m() as double

dim s() as string

dim mins as string

redim m(ubound(x),ubound(x))

redim s(ubound(x),ubound(x))

for i=1 to ubound(x)-1 '从起始点0点到i点的距离

m(i,0)=((x(i)-x(0))^2+(y(i)-y(0))^2)^0.5

s(i,0)="0-" & cstr(i)

'从起始点开始经过K个点后到达i点的短距离m(i,k),s为各点的连线如"0-3-2-1-4"

for k=1 to ubound(x)-2

for i=1 to ubound(x)-1

m(i,k)=10^307

if instr(s(j,k-1),cstr(i))=0 then'避免重复走一点

a=((x(i)-x(j))^2+(y(i)-y(j))^2)^0.5

if a+m(j,k-1)

m(i,k)=a+m(j,k-1)

s(i,k)=s(j,k-1) & "-" & cstr(i)

'计算经过各点后到达一个点的短距离

min=10^307

a=((x(ubound(x))-x(j))^2+(y(ubound(x))-y(j))^2)^0.5

if a+m(j,ubound(x)-2)

min=a+m(j,ubound(x)-2)

msgbox "短距离:" & min & vbcrlf & "短路径:" & mins

End function

private sub Command1_Click

dim x(5) as integer

dim y(5) as integer

dim m as double

x(0)=0

y(0)=0

x(1)=40

y(1)=600

......

x(5)=1000

y(5)=1000

m=min(x,y)

End sub

解决所有节点间的短路径问题时Floyd算法和Dijkstra算法哪个更快?为什么?

dij matlab算法

无负权的话(当然也不能有环)的时候,我是这么理解的:

if(A[i][j]>(A[i][k]+A[k][j]))

Dijkstra因为用优先队列去维持,所以速度还可以

for(int i=1;i<=n;i++)

Floyd的话,其实对于大多数情况,算法很快就收敛了,甚至有时候一次就搞定了。。这个就很神奇。。所以有些迭代不是有必要地,虽然分析是说复杂度是|V|^3之类的吧。。。

我觉得这些复杂度分析也不是说就一定谁快,就是定性吧。。。打个比方:快速排序和合并排序。。虽然都说复杂度是nlgn。。。但是在数据量大的时候,随机快速排序要快得多。。。

关于MATLAB。floyd算法的求助

floyd(a)(把a输入括号这里才行)

单独运行当然没有定义a啊

%floyd.m

%采用floyd算法计算图a中每对顶点短路

%d }是矩离矩阵

%r是路由矩阵

n=size(a,1);

d=a;

forend if i=1:n

for j=1:n

for i=1:n

for j=1:n

if d(i,k)+d(k,j) d(i,j)=d(i,k)+d(k,j);%这里是不是输入错了?看不懂中间为甚么有个空格;

但总体意思是说如果从i节点先到k节点再到j节点间距离比从i直接到j要近的话就替换掉原先endif那条路径

r(i,j)=r(i,k)

kd

rend

Floyd算法D矩阵应该初始化为什么?A带权的邻接矩阵,对角元是0B带权的邻接矩阵,

这是我一点想法,也不晓得对不对。。。

把句震惊,该初始化背带裙的邻接矩阵对角云南区背带裙。

mins=s(j,ubound(x)-2) & "-" & cstr(ubou {nd(x))

Floyd算法D矩阵应该初始化为什么?A带权的邻接矩阵,对角元是0B带权的邻接了LOL诺破破破破色婆婆ing灵敏

为什么floyd算法可以计算负权值图的短路径问题?

int path[MAXV][MAXV];

弗洛伊德算法:Dis(i,j) =min(Dis(i,j), Dis(i,k) + Dr(i,j)=j;%原始默认路径都是各节点间直接到达的距离is(k,j)).

{p(e,k);

我是这么理解的,Dis(i,k)或Dis(k,j)可以有一条边是负的,只要两者之和不是负的就行,因为两个和为负就会选取到这个组合,但是路径的结果不应该是负的。Dijkstra中S(已求出解)中的每一个点解即短路径是已求出的,若存在负数路径,可能存在已求出的解不是解.

a算法求短路径和floyd还有dijsktra算法求短路径的区别?

prev[i] =scanf("%d%d",&s,&e); v0;

A算法是启发式搜索,适合点对点的短路径,单源单汇的情况

rfor k=1:n

Floyd是动态规划的一种,可以求出任意两点之间的短路径

从时间复杂度来说

Floyd是O(N^3)

Dijkstra是O(N^2)

而启发式搜索就不好说了……

结果当然是一样的,都是短路,但是适用情形和时空开销就不同了

举例来说,你做任意两点间短路可以用N次Dijkstra或者1次Floyd,时间消耗一样,显然用后者,而如果你只用求两点间的,用Floyd就不合算了

求一C# floyd算法代码

dist[i] = A[v0][i];

#include S[v0] = true;

#include

int path[101][101]={0};

void p(int e,int s)

{int k=path[e][s];

printf(" %d",k);

p(k,s);

}}

int main()

{memset(path,0,sizeof(path));

int adj[101][101];

int n;

scanf("%d",&n);

for(int j=1;j<=n;j++)

{scanf("%d",&adj[i][j]);

if(adj[i][j]==0) adj[i][j]=65535;

}for(int k=1;k<=n;k++)

if(k!=i)

for(int j=1;j<=n;j++)

if(j!=i && j!=k)

{if(adj[i][k]+adj[k][j]

{adj[i][j]=adj[i][k]+adj[k][j];

path[i][j]=k;

}}

int s,e;

if(adj[s][e]==65535)

printf("No way!!\n");

else

{printf("%d\n",adj[s][e]);

p(s,e);

printf(" %d\n",e);

}return 0;

}/

的floyd算法,它是多源短路径算法,也就说可以给除任意两结点的短路,

先提出疑问,这个算法是怎样做到求短路径的呢?

其实对于短路,我们说的路短也就是是权值小,并不是单方面的说路的长度

这个权值可以是造价,耗费,长度,时间等等,我们首先要理解这一点。

从小张家到小李家有50米的路程,到小王家有10米,小王家到小李家20米远,这时我们

要从小张家到王家少要走多远,答案是30米,我们选择路线的时候没有直接走过去,而且发现

了一中转点,可以使得整个路程更短。其实floyd就用了这种思想,个循环枚举了用哪个

点来作为中转,第二第三循环枚举从谁走到谁,通过枚举所有的情况,就会得到小值。

这时你会想,一个短路是看整体的整个图来确定的,为什么每次两个点就可以搞定呢?

其实是这样的,每个使用过的点,在前一阶段求出了一个值,这时候再用它就等于已经继承了

它前面所计算出来的短路的值,同过这个短值上再去选择一条路,然后新形成的路还是一条

短路,只是起终点不一样罢了。

这个算法抽象度较高,需加以图解和多想,掌握这个算法比较重要,它的思想在以后的

图论学习中比较重要,特别是继承的这种思想和松y(i-1,j-1)=0;弛技术。

/

matlab实现floyd算法的程序存在问题

D=[0 128 ;192 64];

调用的时候输入一个实A[i][j]=g.edges[i][j];际参数a就可以了。

int prev[MAXNUM];因为你现在函数里面a只是一个形式参数,没有具体的值。

你可以在函数中定义一个关联矩阵a,或者在命令窗口输入一个矩阵a,再调用 [D,path]=floyd1(a),应该就行了.

版权声明:本文内容由互联。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发 a13828211729@163.com 邮箱删除。