一、实验学时: 2学时 二、实验目的
1.实现图的基本操作 2.实现图的遍历操作
三、实验内容(2,3选做)
1. 深度优先和广度优先搜索图 2. 求图的关键路径 3.求图的最短路径
四、主要仪器设备及耗材
硬件:计算机一台
软件:VC++ 6.0,MSDN2003或者以上版本
五、实验步骤
1. 分析问题 2. 写出算法 3. 编制程序 4. 上机调试 5. 分析结果
六、程序清单
#include #define MaxInt 32767 //权值的最大值 #define MVNum 100 //最大顶点数 #define max 50 //邻接矩阵存储结构定义 typedef struct{ char vexs[MVNum]; //存放顶点的数组 int arcs[MVNum][MVNum]; //存放邻接矩阵的数组 int vexnum,arcnum; //顶点数和边(弧)数 }AMGraph; //边(弧)结点结构定义 typedef struct ArcNode{ int adjvex; struct ArcNode* nextarc; int weight; }ArcNode; //顶点类型定义 typedef struct VNode{ char data; ArcNode* firstarc; }VNode,AdjList[MVNum]; //顶点数组类型定义 //邻接表结构定义 typedef struct{ AdjList vertices; //顶点数组 int vexnum,arcnum; //顶点数和边(弧)数 }ALGraph; //顺序队列结构定义 typedef struct{ int front; //队头 int rear; //队尾 char base[MVNum]; //存放队列元素的数组 }SqQueue; bool visited[MVNum]; //存放图中顶点访问标志的数组 //初始化队列 void InitQueue(SqQueue &Q) { Q.front = Q.rear = 0; } //判断队列Q是否为空,为空返回true,非空返回false bool QueueEmpty(SqQueue Q) { if(Q.rear == Q.front ) return true; else return false; } //入队操作,将n插入顺序队列Q的尾部 void EnQueue(SqQueue &Q,int n) { if(Q.rear-Q.front == MVNum) //队满时,不能执行入队操作 exit(-1); else { Q.base[Q.rear] = n; Q.rear++; } } //出队操作,删除队列Q的队头元素,被删元素用n返回 void DeQueue(SqQueue &Q,int &n) { if(QueueEmpty(Q)) //若队列为空,不能执行出队操作 exit(-1); else { n = Q.base [Q.front]; Q.front++; } } //在以邻接表方式存储的图G中,查找值为ch的顶点的位置 int LocateVex(ALGraph G,char ch) { for(int i=0;i ArcNode *p1,*p2; cout<<\"请输入要创建的无向图的顶点数和边数,中间用空格分隔:\"< //以邻接矩阵为存储结构,创建有向图G void CreateDG_AM(AMGraph &G) { int i, j, k; char v1, v2; cout<<\"请输入要创建的有向网的顶点数和边数,中间用空格分隔:\"< //以邻接矩阵为存储结构,创建有向网G void CreateDN_AM(AMGraph &G) { int i, j, k, w; char v1, v2; cout<<\"请输入要创建的有向网的顶点数和边数,中间用空格分隔:\"< //从图中的第v个顶点出发,深度遍历图G(以邻接表为存储结构) void DFS(ALGraph G,int v) { ArcNode *p; int w; cout << G.vertices[v].data << \" \"; //输出第v个顶点 visited[v] = true; //设置第v个顶点的访问标志 //依次从v的未被访问过的邻接点出发,深度遍历图G p = G.vertices[v].firstarc; //p指向v的边链表的第一个边结点 while(p) //边结点非空 { w = p->adjvex; //表示w是v的邻接点 if(!visited[w]) DFS(G, w); //如果w未访问,则递归调用DFS p = p->nextarc; //p指向下一个边结点 } } //深度遍历图G void DFSTraverse(ALGraph G) { int v; for(v=0;v //广度遍历图G void BFSTraverse(ALGraph G) { int v; for(v=0;v cout << \"->\"; cout << p->adjvex; p = p->nextarc; } } cout << endl; } } int main() { ALGraph G; AMGraph G1; char ch; int k; //以下操作完成无向图G的创建(基于邻接表存储方式)、G的深度遍历和广度遍历 cout<<\"以下操作完成无向图G的创建(基于邻接表存储方式)、G的深度遍历和广度遍历\"< 七、运行结果及分析 一、无向图G的邻接表和深度、广度遍历: 下图是一种解法: 二、无向网G1的邻接矩阵和迪杰斯特拉求最短路径: 下图是一种解法: 三、问题与解决方法: 问题一:广度遍历序列和预想的不一样。 解决方法:在查看了一下我的广度遍历BFS(ALGraph G,int v)之后,我找出来原来是代码写错了。改正后,可以得到想要的结果啦。 问题二:在用迪杰斯特拉算法,输出源点到其它顶点的最短路径及路径长度时,输出的最短路径都是倒着的,很不舒服。 解决方法:首先,我自己尝试修改了一下,达不到正序排列的效果,于是,我就上网查了一下,做了一些调整后,终于实现了预期的效果。 因篇幅问题不能全部显示,请点此查看更多更全内容