1、实验七(二) 图的应用实验目的:1、 熟悉的图的两种存储方式:邻接矩阵和邻接表;2、 通过实验,掌握图的应用:求最小生成树、最短路径、关键路径、拓扑排序;实验要求:1、 在 vc+或 tc 环境下实现基本功能;2、 先完成基本功能,基本功能为必做内容,有多余时间的同学可以做选做的内容;3、 独自完成实验操作,并给出相关的数据;4、 每次实验后,撰写实验报告,并在下星期四由学习委员收集并按学号整理好后,交任课教师。实验内容及步骤:必做题:1、 构造一个网(有向或无向) ;2、 求该网的 prim 算法生成的最小生成树或森林;3、 求一个源点到其余顶点的最短路径; ;选做:1、求该网的拓扑排序和逆
2、拓扑排序;参考程序:2、求该网的 prim 算法生成的最小生成树或森林#include typedef int InfoType;#defineMAXV 100 /最大顶点个数/以下定义邻接矩阵类型typedef struct int no; /顶点编号InfoType info; /顶点其他信息 VertexType; /顶点类型typedef struct /图的定义 int edgesMAXVMAXV; /邻接矩阵int vexnum,arcnum; /顶点数,弧数VertexType vexsMAXV; /存放顶点信息 MGraph; /图的邻接矩阵类型/以下定义邻接表类型typede
3、f struct ANode /弧的结点结构类型 int adjvex; /该弧的终点位置struct ANode *nextarc; /指向下一条弧的指针InfoType info; /该弧的相关信息,这里用于存放权值 ArcNode;typedef int Vertex;typedef struct Vnode /邻接表头结点的类型 Vertex data; /顶点信息ArcNode *firstarc; /指向第一条弧 VNode;typedef VNode AdjListMAXV;/AdjList 是邻接表类型typedef struct AdjList adjlist; /邻接表in
4、t n,e; /图中顶点数 n 和边数 e ALGraph; /图的邻接表类型#define INF 32767 /用 32767 表示void DispMat(MGraph g)/输出邻接矩阵 gint i,j;for (i=0;itypedef int InfoType;#defineMAXV 100 /最大顶点个数/以下定义邻接矩阵类型typedef struct int no; /顶点编号InfoType info; /顶点其他信息 VertexType; /顶点类型typedef struct /图的定义 int edgesMAXVMAXV; /邻接矩阵int vexnum,arcn
5、um; /顶点数,弧数VertexType vexsMAXV; /存放顶点信息 MGraph; /图的邻接矩阵类型/以下定义邻接表类型typedef struct ANode /弧的结点结构类型 int adjvex; /该弧的终点位置struct ANode *nextarc; /指向下一条弧的指针InfoType info; /该弧的相关信息,这里用于存放权值 ArcNode;typedef int Vertex;typedef struct Vnode /邻接表头结点的类型 Vertex data; /顶点信息ArcNode *firstarc; /指向第一条弧 VNode;typede
6、f VNode AdjListMAXV;/AdjList 是邻接表类型typedef struct AdjList adjlist; /邻接表int n,e; /图中顶点数 n 和边数 e ALGraph; /图的邻接表类型#define INF 32767 /用 32767 表示void DispMat(MGraph g)/输出邻接矩阵 gint i,j;for (i=0;ig.vexnum;i+)for (j=0;jg.vexnum;j+)if (g.edgesij=INF)printf(“%3s“,“);elseprintf(“%3d“,g.edgesij);printf(“n“);vo
7、id ppath(int path,int i,int v0) int k;k=pathi;if (k=v0) return;ppath(path,k,v0);printf(“%d,“,k);void DisPath(int dist,int path,int s,int n,int v0) /由 path 计算最短路径int i;printf(“ path:“); /输出 path 值for (i=0;in;i+)printf(“%3d“,pathi);printf(“n“);for (i=0;in;i+)if (si=1 printf(“%d,“,v0);ppath(path,i,v0);
8、printf(“%dn“,i);else printf(“ 从 %d 到%d 不存在路径 n“,v0,i);void Dijkstra(MGraph g,int v0) /狄克斯特拉算法从顶点 v0 到其余各顶点的最短路径int distMAXV,pathMAXV;int sMAXV;int mindis,i,j,u,n=g.vexnum;for (i=0;in;i+) disti=g.edgesv0i; /距离初始化si=0; /s置空if (g.edgesv0iINF) /路径初始化pathi=v0;elsepathi=-1;sv0=1;pathv0=0; /源点编号 v0 放入 s 中f
9、or (i=0;in;i+) /循环直到所有顶点的最短路径都求出mindis=INF;u=-1;for (j=0;jn;j+) /选取不在 s 中且具有最小距离的顶点 uif (sj=0 mindis=distj;su=1; /顶点 u 加入 s 中for (j=0;jn;j+) /修改不在 s 中的顶点的距离if (sj=0) if (g.edgesujINF pathj=u; printf(“输出最短路径:n“);DisPath(dist,path,s,n,v0); /输出最短路径void main()int i,j,u=0;MGraph g;int AMAXV6=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;ig.vexnum;i+)for (j=0;jg.vexnum;j+)g.edgesij=Aij;printf(“n“);printf(“有向图 G 的邻接矩阵:n“);DispMat(g);Dijkstra(g,u);printf(“n“);