#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define INF 32767
#define MAVX 100
#define MAXE 100
typedef int InfoType;
typedef int Vertex;
typedef struct
{
int no;
InfoType info;
}VertexType;
typedef struct
{
int edges[MAVX][MAVX];
int vexnum,arcnum;
VertexType vexs[MAVX];
}MGraph;
typedef struct ANode
{
int adjvex;
struct ANode *nextarc;
InfoType info;
}ArcNode;
typedef struct Vnode
{
Vertex data;
ArcNode *firstarc;
}VNode;
typedef VNode AdjList[MAVX];
typedef struct
{
AdjList adjlist;
int n,e;
}ALGraph;
void DispMat(MGraph g)
{
int i,j;
for(i=0;i<g.vexnum;i++)
{
for(j=0;j<g.vexnum;j++)
if(g.edges[i][j]==INF)
printf("%3s","∞");
else
printf("%3d",g.edges[i][j]);
printf("\n");
}
}
void ppath(int path[][MAVX],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[][MAVX],int path[][MAVX],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路径为:",i,j);
printf("%d,",i);
ppath(path,i,j);
printf("%d",j);
printf("\t路径长度为:%d\n",A[i][j]);
}
}
void Floyd(MGraph g)
{
int A[MAVX][MAVX],path[MAVX][MAVX];
int i,j,k,n=g.vexnum;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
A[i][j]=g.edges[i][j];
path[i][j]=-1;
}
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(A[i][j]>(A[i][k]+A[k][j]))
{
A[i][j]=A[j][k]+A[k][j];
path[i][j]=k;
}
}
printf("\n弗洛伊德算法输出最短路径:\n\n");
DisPath(A,path,n);
}
int main()
{
int i,j,u=0;
MGraph g;
int A[MAVX][6]={
{INF,5,INF,7,INF,INF},
{INF,INF,4,INF,INF,INF},
{8,INF,INF,INF,INF,9},
{INF,INF,5,INF,INF,6},
{INF,INF,INF,5,INF,INF},
{3,INF,INF,INF,1,INF} } ;
g.vexnum=6;
g.arcnum=10;
for(i=0;i<g.vexnum;i++)
for(j=0;j<g.vexnum;j++)
g.edges[i][j]=A[i][j];
printf("\n");
printf("有向图G的邻接矩阵:\n");
DispMat(g);
Floyd(g);
printf("\n\n");
return 0;
}
数据结构源码笔记(C语言描述)汇总: