%floif(k!=0)yd.m
floyd算法 floyd算法是什么意思
% %采用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; Function Min(x() as integer,y() as integer) as double dim i,j,k,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 无负权的话(当然也不能有环)的时候,我是这么理解的: Dijkstra因为用优先队列去维持,所以速度还可以 Floyd的话,其实对于大多数情况,算法很快就收敛了,甚至有时候一次就搞定了。。这个就很神奇。。所以有些迭代不是有必要地,虽然分析是说复杂度是|V|^3之类的吧。。。 我觉得这些复杂度分析也不是说就一定谁快,就是定性吧。。。打个比方:快速排序和合并排序。。虽然都说复杂度是nlgn。。。但是在数据量大的时候,随机快速排序要快得多。。。 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带权的邻接了LOL诺破破破破色婆婆ing灵敏 弗洛伊德算法:Dis(i,j) =min(Dis(i,j), Dis(i,k) + Dr(i,j)=j;%原始默认路径都是各节点间直接到达的距离is(k,j)). 我是这么理解的,Dis(i,k)或Dis(k,j)可以有一条边是负的,只要两者之和不是负的就行,因为两个和为负就会选取到这个组合,但是路径的结果不应该是负的。Dijkstra中S(已求出解)中的每一个点解即短路径是已求出的,若存在负数路径,可能存在已求出的解不是解. A算法是启发式搜索,适合点对点的短路径,单源单汇的情况 Floyd是动态规划的一种,可以求出任意两点之间的短路径 从时间复杂度来说 Floyd是O(N^3) Dijkstra是O(N^2) 而启发式搜索就不好说了…… 结果当然是一样的,都是短路,但是适用情形和时空开销就不同了 举例来说,你做任意两点间短路可以用N次Dijkstra或者1次Floyd,时间消耗一样,显然用后者,而如果你只用求两点间的,用Floyd就不合算了 #include #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;弛技术。 / 调用的时候输入一个实A[i][j]=g.edges[i][j];际参数a就可以了。 int prev[MAXNUM];因为你现在函数里面a只是一个形式参数,没有具体的值。 你可以在函数中定义一个关联矩阵a,或者在命令窗口输入一个矩阵a,再调用 [D,path]=floyd1(a),应该就行了.用编写的floyd算法求两点间的短路径,怎么输出path经过的顶点序列?
function [D,R]= floydwarshall(A)解决所有节点间的短路径问题时Floyd算法和Dijkstra算法哪个更快?为什么?
dij matlab算法关于MATLAB。floyd算法的求助
Floyd算法D矩阵应该初始化为什么?A带权的邻接矩阵,对角元是0B带权的邻接矩阵,
这是我一点想法,也不晓得对不对。。。为什么floyd算法可以计算负权值图的短路径问题?
int path[MAXV][MAXV];a算法求短路径和floyd还有dijsktra算法求短路径的区别?
prev[i] =scanf("%d%d",&s,&e); v0;求一C# floyd算法代码
dist[i] = A[v0][i];matlab实现floyd算法的程序存在问题
D=[0 128 ;192 64];
版权声明:本文内容由互联。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发 a13828211729@163.com 邮箱删除。