floyed(记录路径)
2015-12-17 17:37
381 查看
用领接矩阵写的记录路径代码,表示数据结构好复杂,链表什么的,指针什么的,得有耐性和细心.
代码如下:
代码如下:
#include<stdio.h> #define INF 0x3f3f3f3f #define MAXN 100 int d[MAXN][MAXN]; int path[MAXN][MAXN]; typedef struct { char v[MAXN];//记录顶点信息 int edge[MAXN][MAXN];//记录边的信息 int vum;//顶点总数 }ART;//结点 int Locata(ART &G , char c){//没有使用&错了好几遍,why?。。。。。。 for(int i = 0; i < G.vum; ++i) if(G.v[i] == c) return i; return -1; } void Createart(ART &G,int n,int m){ char v1,v2; int w; char c; for(int i=0;i<n;i++){ getchar(); scanf("%c",&G.v[i]); } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(j!=i) G.edge[i][j]=INF; else G.edge[i][j]=0; } }//初始化矩阵 for(int i=0;i<m;i++){ getchar(); scanf("%c%c%d",&v1,&v2,&w); int x=Locata(G,v1); int y=Locata(G,v2); G.edge[x][y]=w; } } void floyd(ART &G){ for(int i=0;i<G.vum;i++){ for(int j=0;j<G.vum;j++){ d[i][j]=G.edge[i][j]; if(d[i][j]<INF&&i!=j){ path[i][j]=i;//记录j的前驱 } else path[i][j]=-1; } } for(int k=0;k<G.vum;k++) for(int i=0;i<G.vum;i++) for(int j=0;j<G.vum;j++){ if(d[i][k]+d[k][j]<d[i][j]){ d[i][j]=d[i][k]+d[k][j]; path[i][j]=k;//更换前驱 } } } void show(ART G,int x,int y){ if(path[x][y]!=-1){ show(G,x,path[x][y]); printf("%c-->",G.v[path[x][y]]); } } int main(){ int n,m; char star,end; ART G; printf("请输入顶点的数目和边的数目:"); scanf("%d%d",&n,&m); G.vum=n; Createart(G,n,m); floyd(G); getchar(); scanf("%c%c",&star,&end); n=Locata(G,star); m=Locata(G,end); show(G,n,m); printf("%c\n",end); return 0; }
相关文章推荐
- WM_SYSCOMMAND包括很多功能,比如:拖动左边框、拖动标题栏、滚动条滚动、点击最小化、双击标题栏——Delphi 通过事件代替了大部分常用的消息,所以Delphi 简单、易用、高效
- IE浏览器兼容问题
- redis 学习手册之java和php连接redis操作
- 什么是 Conversion to Dalvik format failed ?
- nginx记录响应与POST请求日志
- 自定义Hive Sql Job分析工具
- Matlab 条形图绘制 以及 添加误差棒 改变条形图形状
- 编程思维
- map的insert会自动忽略重复key,而不是替换
- 添加jar
- 06-CABasicAnimation基础核心动画
- 轻松学习JavaScript十九:DOM编程之在HTML文档什么位置编写JS代码
- Android 一个简易的自定义软键盘
- HDFS数据资源使用量分析以及趋势预测
- XUtils
- android特有的核心模块(Linux内核层)
- 光立方——电子制作的软件模拟
- Android Open Source:陌陌(momo)源代码及实现(大部分UI+功能)
- git add shh public key
- 3列 高度自适应 文字上下左右居中