第十三周项目四(Floyd算法实现)
来源:互联网 发布:欧美女歌手 知乎 编辑:程序博客网 时间:2024/05/01 04:16
- *Copyright(c)2016,烟台大学计算机与控制工程学院
- *All right reserved.
- *文件名称:Floyd算法实现.cpp
- *作者:宋雨静
- *时间:12月8日
- *版本号;v1.0
- *问题描述:
-
- Floyd算法实现
- *输入描述:带权图的邻接矩阵
- *程序输出:图中所有点之间的路径长度及其具体路径
- */
-
- [cpp] view plain copy
- #include <stdio.h>
- #include <malloc.h>
- #define MAXV 100 //最大顶点个数
- #define INF 32767 //INF表示∞
- #define MaxSize 100
- typedef int InfoType;
-
-
- typedef struct
- {
- int no;
- InfoType info;
- } VertexType;
-
- typedef struct
- {
- int edges[MAXV][MAXV];
- int n,e;
- VertexType vexs[MAXV];
- } MGraph;
-
-
- typedef struct ANode
- {
- int adjvex;
- struct ANode *nextarc;
- InfoType info;
- } ArcNode;
-
- typedef int Vertex;
-
- typedef struct Vnode
- {
- Vertex data;
- int count;
- ArcNode *firstarc;
- } VNode;
-
- typedef VNode AdjList[MAXV];
-
- typedef struct
- {
- AdjList adjlist;
- int n,e;
- } ALGraph;
- typedef struct
- {
- int u;
- int v;
- int w;
- } Edge;
- void Ppath(int path[],int i,int v);
- void Dispath(int dist[],int path[],int s[],int n,int v);
- void Dijkstra(MGraph g,int v);
- void ArrayToMat(int *Arr, int n, MGraph &g);
- void Floyd(MGraph g);
- void Ppath(int path[][MAXV],int i,int j)
- {
- int k;
- k=path[i][j];
- if (k==-1) return;
- Ppath(path,i,k);
- printf("%d,",k);
- Ppath(path,k,j);
- }
- void Dispath(int A[][MAXV],int path[][MAXV],int n)
- {
- int i,j;
- for (i=0; i<n; i++)
- for (j=0; j<n; j++)
- {
- if (A[i][j]==INF)
- {
- if (i!=j)
- printf("从%d到%d没有路径\n",i,j);
- }
- else
- {
- printf(" 从%d到%d=>路径长度:%d 路径:",i,j,A[i][j]);
- printf("%d,",i);
- Ppath(path,i,j);
- printf("%d\n",j);
- }
- }
- }
- void ArrayToMat(int *Arr, int n, MGraph &g)
- {
- int i,j,count=0;
- g.n=n;
- for (i=0; i<g.n; i++)
- for (j=0; j<g.n; j++)
- {
- g.edges[i][j]=Arr[i*n+j];
- if(g.edges[i][j]!=0)
- count++;
- }
- g.e=count;
- }
- void Floyd(MGraph g)
- {
- int A[MAXV][MAXV],path[MAXV][MAXV];
- int i,j,k;
- for (i=0; i<g.n; i++)
- for (j=0; j<g.n; j++)
- {
- A[i][j]=g.edges[i][j];
- path[i][j]=-1;
- }
- for (k=0; k<g.n; k++)
- {
- for (i=0; i<g.n; i++)
- for (j=0; j<g.n; j++)
- if (A[i][j]>A[i][k]+A[k][j])
- {
- A[i][j]=A[i][k]+A[k][j];
- path[i][j]=k;
- }
- }
- Dispath(A,path,g.n);
- }
- int main()
- {
- MGraph g;
- int A[4][4]=
- {
- {0, 5,INF,7},
- {INF,0, 4,2},
- {3, 3, 0,2},
- {INF,INF,1,0}
- };
- ArrayToMat(A[0], 4, g);
- Floyd(g);
- return 0;
- }
运行结果: 0 0