备战国赛--Floyd算法的实现
来源:互联网 发布:飞鹰网络电视apk 编辑:程序博客网 时间:2024/05/20 08:41
之前图论学的一团糟,用的又少,基本上处于小白的状态,刚好2011年数模国赛B题用到了多源最短路径的知识,就好好看了看Floyd算法的知识,源代码参考了百度百科
C语言:
#include<stdio.h>#include<stdlib.h>#define maxn 100000int d[1000][1000],path[1000][1000];int main(){ int i,j,k,m,n; int x,y,z; scanf("%d%d",&n,&m);//输入图的点、边 for(i = 1;i <= n;i++){ for(j = 1;j <= n;j++){ d[i][j] = maxn; path[i][j] = j; } } for(i = 1;i <= m;i++){ scanf("%d%d%d",&x,&y,&z); d[x][y] = z; d[y][x] = z; } for(k = 1;k <= n;k++){ for(i = 1;i <= n;i++){ for(j =1;j <= n;j++){ if(d[i][j] > d[i][k] + d[k][j]){ d[i][j] = d[i][k] + d[k][j]; path[i][j] = path[i][k]; } } } } for(i=1;i<=n;i++) for(j=1;j<=i;j++) if (i!=j) printf("%d->%d:%d\n",i,j,d[i][j]);// int f, en;// scanf("%d%d",&f,&en);// while (f!=en) {// printf("%d->",f);// f=path[f][en];// }// printf("%d",en); return 0;}
matlab实现:
function Floyd(w,router_direction,MAX)%w为此图的距离矩阵%router_direction为路由类型:0为前向路由;非0为回溯路由%MAX是数据输入时的∞的实际值len=length(w);flag=zeros(1,len);%根据路由类型初始化路由表R=zeros(len,len);for i=1:lenif router_direction==0%前向路由R(:,i)=ones(len,1)*i;else %回溯路由R(i,:)=ones(len,1)*i;endR(i,i)=0;enddisp('');disp('w(0)');dispit(w,0);disp('R(0)');dispit(R,1);%处理端点有权的问题for i=1:lentmp=w(i,i)/2;if tmp~=0w(i,:)=w(i,:)+tmp;w(:,i)=w(:,i)+tmp;flag(i)=1;w(i,i)=0;endend%Floyd算法具体实现过程for i=1:lenfor j=1:lenif j==i || w(j,i)==MAXcontinue;endfor k=1:lenif k==i || w(j,i)==MAXcontinue;endif w(j,i)+w(i,k)<w(j,k) %Floyd算法核心代码w(j,k)=w(j,i)+w(i,k);if router_direction==0%前向路由R(j,k)=R(j,i);else %回溯路由R(j,k)=R(i,k);endendendend%显示每次的计算结果disp(['w(',num2str(i),')'])dispit(w,0);disp(['R(',num2str(i),')'])dispit(R,1);end%中心和中点的确定[Center,index]=min(max(w'));disp(['中心是V',num2str(index)]);[Middle,index]=min(sum(w'));disp(['中点是V',num2str(index)]);endfunction dispit(x,flag)%x:需要显示的矩阵%flag:为0时表示显示w矩阵,非0时表示显示R矩阵len=length(x);s=[];for j=1:lenif flag==0s=[s sprintf('%5.2f\t',x(j,:))];elses=[s sprintf('%d\t',x(j,:))];ends=[s sprintf('\n')];enddisp(s);disp('---------------------------------------------------');end% 选择后按Ctrl+t取消注释号%%% 示例:% a=[% 0,100,100,1.2,9.2,100,0.5;% 100,0,100,5,100,3.1,2;% 100,100,0,100,100,4,1.5;% 1.2,5,100,0,6.7,100,100;% 9.2,100,100,6.7,0,15.6,100;% 100,3.1,4,100,15.6,0,100;% 0.5,2,1.5,100,100,100,0% ];%% b=[% 0,9.2,1.1,3.5,100,100;% 1.3,0,4.7,100,7.2,100;% 2.5,100,0,100,1.8,100;% 100,100,5.3,0,2.4,7.5;% 100,6.4,2.2,8.9,0,5.1;% 7.7,100,2.7,100,2.1,0% ];%% Floyd(a,1,100)% Floyd(b,1,100)
有后续的感悟会再来更新,现在主要还是备国赛的代码库,博主小白,还望大佬不要嘲笑
阅读全文
0 0
- 备战国赛--Floyd算法的实现
- java实现的floyd算法
- Floyd算法的java实现
- Dijkstra算法和Floyd算法的实现
- floyd最短路径算法的实现
- Floyd算法的原理和实现
- Java实现Floyd算法
- floyd算法实现
- Floyd算法Cpp实现
- PHP实现Floyd算法
- python实现Floyd算法
- Floyd算法的证明
- Floyd算法的总结
- floyd算法的理解
- Floyd算法的验证
- Floyd算法的验证
- Floyd算法的理解
- 图的最短路径算法(Dijkstra,Floyd)的实现
- 280
- NYOJ题目219-An problem about date
- Apache JMeter常用快捷键
- Python基础学习(一)
- 281
- 备战国赛--Floyd算法的实现
- react native学习笔记5——布局实战篇
- 282
- python beautiful soup库的超详细用法
- Spring Cloud Sleuth+Zipkin实践
- 283
- 284
- DeepLearning(花书)第三章主要内容(1-7节)
- 285