1、图的基本操作实验七:图的基本操作(1)键盘输入数据,建立一个有向图的邻接表。(2)输出该邻接表。(3)在有向图的邻接表的基础上计算各顶点的度,并输出。(4)以有向图的邻接表为基础实现输出它的拓扑排序序列。(5)采用邻接表存储实现无向图的深度优先遍历。(6)采用邻接表存储实现无向图的广度优先遍历。(7)采用邻接矩阵存储实现无向图的最小生成树的PRIM算法。(8)采用邻接矩阵存储一个有向图,输出单源点到其它顶点的最短路径。(9)在主函数中设计一个简单的菜单,分别调试上述算法。综合训练:为计算机专业设计教学计划:4个学年,每学年2个学期,开设50门课程,每学期所开课程门数尽量均衡,课程的安排必须满足
2、先修关系。#include#include#include#includeusing namespace std;#define max_vertex_num 20#define INFINITY 1000000000typedef struct ArcNode int adjvex; struct ArcNode *nextarc;ArcNode;typedef char vertexType;typedef struct VNode vertexType data; ArcNode *firstarc; int count;VNode,AdjListmax_vertex_num;typed
3、ef struct AdjList vertices; int vexnum,arcnum; int degree;ALGraph;/邻接表typedef struct ArcCell int adj;ArcCell,AdjMatrixmax_vertex_nummax_vertex_num;typedef struct char vexmax_vertex_num; AdjMatrix arc; int vexnum,arcnum;MGraph;/邻接矩阵ALGraph ALG,InsertALG,UALG;MGraph G;int visitmax_vertex_num;struct ed
4、ge char adjvex; int lowcost;closedgemax_vertex_num;int Pmax_vertex_num;int Dmax_vertex_num;int finialmax_vertex_num;void print() printf((1)键盘输入数据,建立一个有向图的邻接表n); printf((2)输出该邻接表n); printf((3)在有向图的邻接表的基础上计算各顶点的度,并输出n); printf((4)以有向图的邻接表为基础实现输出它的拓扑排序序列n); printf((5)采用邻接表存储实现无向图的深度优先遍历n); printf((6)采用
5、邻接表存储实现无向图的广度优先遍历n); printf((7)采用邻接矩阵存储实现无向图的最小生成树的PRIM算法n); printf((8)采用邻接矩阵存储一个有向图,输出单源点到其它顶点的最短路径n); printf((0)退出程序n); int locatevex(MGraph G,char v)/查找顶点在图中的位置 int i=0; while(iG.vexnum) if(v=G.vexi) break; else i+; return i;void CreateALGraph(ALGraph &ALG,ALGraph &InsertALG)/创建有向邻接表及其逆邻接表并且其顶点用大
6、写字母表示 int i,j,k; ArcNode *s,*r; printf(请输入有向邻接表的顶点数和边数:n); scanf(%d%d,&ALG.vexnum,&ALG.arcnum); for(i=0;iALG.vexnum;i+) ALG.verticesi.data=A+i; ALG.verticesi.firstarc=NULL; InsertALG.verticesi.data=A+i; InsertALG.verticesi.firstarc=NULL; for(k=0;kadjvex=j; s-nextarc=ALG.verticesi.firstarc; ALG.verti
7、cesi.firstarc=s; r-adjvex=i; r-nextarc=InsertALG.verticesj.firstarc; InsertALG.verticesj.firstarc=r; void CeratUALGraph(ALGraph &UALG)/用头插法建立无向邻接表 int i,j,k; ArcNode *p; printf(请输入无向邻接表的的顶点数和边数:n); scanf(%d%d,&UALG.vexnum,&UALG.arcnum); for(i=0;iUALG.vexnum;i+) UALG.verticesi.data=A+i; UALG.vertices
8、i.firstarc=NULL; for(k=0;kadjvex=j; p-nextarc=UALG.verticesi.firstarc; UALG.verticesi.firstarc=p; p=(ArcNode *)malloc(sizeof(ArcNode); p-adjvex=i; p-nextarc=UALG.verticesj.firstarc; UALG.verticesj.firstarc=p; void CreateUDN(MGraph &G,int a)/若a=1的时候创建无向邻接矩阵,否则创建有向邻接矩阵 int i,j,k,w; char v1,v2; printf(
9、请输入邻接矩阵的顶点数和边数:n); scanf(%d%d,&G.vexnum,&G.arcnum); getchar(); for(i=0;iG.vexnum;i+) scanf(%c,&G.vexi); for(i=0;iG.vexnum;i+) for(j=0;jG.vexnum;j+) G.arcij.adj=INFINITY; for(k=0;kG.arcnum;k+) getchar(); scanf(%c %c %d,&v1,&v2,&w); i=locatevex(G,v1); j=locatevex(G,v2); G.arcij.adj=w; if(a=1) G.arcji.
10、adj=G.arcij.adj; void shuchu(ALGraph ALG)/遍历邻接表并输出 int i; ArcNode *p; for(i=0;inextarc) printf(%d ,p-adjvex); printf(n); void Degree(ALGraph ALG,ALGraph InsertALG)/计算邻接表的度=邻接表的出度+逆邻接表的的出度 int i; ArcNode *p; for(i=0;inextarc) ALG.verticesi.count+; for(i=0;inextarc) InsertALG.verticesi.count+; for(i=0
11、;iadjvex) dfs(UALG,p-adjvex); p=p-nextarc; void DFSTraverse(ALGraph UALG) for(int i=0;iUALG.vexnum;i+) visiti=0; for(i=0;iUALG.vexnum;i+) if(!visiti) dfs(UALG,i); printf(n);void BFSTraverse(ALGraph UALG)/广度优先遍历 ArcNode *p; int v; queueq; for(int i=0;iUALG.vexnum;i+) visiti=0; for(i=0;iadjvex) visitp
12、-adjvex=1; printf(%cn,UALG.verticesp-adjvex.data); q.push(p-adjvex); p=p-nextarc; void prim(MGraph G,char v)/用prim算法求最小生成树 int i,j,k,min,n; k=locatevex(G,v); for(i=0;iG.vexnum;i+) if(i!=k) closedgei.adjvex=v; closedgei.lowcost=G.arcki.adj; closedgek.lowcost=0; for(i=1;iG.vexnum;i+) min=INFINITY; for
13、(j=0;jG.vexnum;j+) if(closedgej.lowcost!=0&closedgej.lowcostmin) n=j; min=closedgej.lowcost; printf(%c %cn,closedgen.adjvex,G.vexn); closedgen.lowcost=0; for(j=0;jG.vexnum;j+) if(G.arcnj.adjclosedgej.lowcost&G.arcnj.adj!=INFINITY) closedgej.adjvex=G.vexn; closedgej.lowcost=G.arcnj.adj; printf(n);int
14、 indegreemax_vertex_num;int topsort(ALGraph ALG,ALGraph InsertALG)/拓扑排序 ArcNode *p; stacks; int i,k,count; for(i=0;inextarc) InsertALG.verticesi.count+; for(i=0;iALG.vexnum;i+) indegreei=InsertALG.verticesi.count; printf(%dn,indegreei); for(i=0;inextarc) k=p-adjvex; indegreek-; if(indegreek=0) s.pus
15、h(k); if(countALG.vexnum) return -1; else return 1;void short_dij(MGraph G,int v0,int *P,int *D)/用dij球最短路径 int i,v,w,min; for(i=0;iG.vexnum;i+) finiali=0; Di=G.arcv0i.adj; if(DiINFINITY) Pi=v0; Dv0=0;finialv0=1; for(i=1;iG.vexnum;i+) min=INFINITY; for(w=0;wG.vexnum;w+) if(finialw=0) if(Dwmin) v=w; m
16、in=Dw; if(minINFINITY) finialv=1; else break; for(w=0;wG.vexnum;w+) if(finialw=0&min+G.arcvw.adjDw) Dw=min+G.arcvw.adj; Pw=v; printf(%d ,Pw); printf(n); printf(路径长度为:n); for(i=0;iG.vexnum;i+) if(Di=INFINITY) printf(无法到达!n); else printf(%dn,Di); int main() int menu; char V; do void print(); scanf(%d,
17、&menu); switch(menu) case 1: CreateALGraph(ALG,InsertALG);break; case 2: shuchu(ALG); break; case 3: CreateALGraph(ALG,InsertALG);Degree( ALG, InsertALG);break; case 4: CreateALGraph(ALG,InsertALG);topsort( ALG,InsertALG);break; case 5: CeratUALGraph(UALG);DFSTraverse(UALG);break; case 6: CeratUALGraph(UALG);BFSTraverse(UALG);break; case 7: CreateUDN(G,1);printf(请输入出发顶点:n);scanf(%c,&V);prim(G,V);break; case 8: CreateUDN(G,0);short_dij( G, 0,P,D);break; case 0: return 0; while(menu!=0); return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1