图的应用的实验报告
for(i=0;i<G.vexnum;++i) /*构造顶点向量*/
{
cin>>G.vertices[i].data;
G.vertices[i].firstarc=NULL;
}
cout<<"是否含有权值:(若不含权值请输入0,否则输入1)\n";
cin>>G.Isquan;
if (!G.Isquan)
cout<<"创建图:\n";
CreateGraph(g);
cout<<"输出图的信息:\n";
Display(g);
cout<<"拓扑排序:\n";
ToopologicalSort(g);
cout<<"求关键历经:\n";
ToopologicalOrder(g,T);
CriticalPath(g,T);
Status ToopologicalOrder (MGraph g,Sqstack &T)//拓扑序列
Status CriticalPath(MGraph g,Sqstack T)//关键路径
㈡、函数调用及主函数设计( 可用函数的调用关系图说明)
void main()
{
MGraph g;
Sqstack T;
实验六 图的应用及其实现
一、实验目的
1.进一步功固图常用的存储结构。
2.熟练掌握在图的邻接表实现图的基本操作。
3.理解掌握AOV网、AOE网在邻接表上的实现以及解决简单的应用问题。
二、实验内容
[题目一]:从键盘上输入AOV网的顶点和有向边的信息,建立其邻接表存储结构,然后对该图拓扑排序,并输出拓扑序列. 试设计程序实现上述AOV网的类型定义和基本操作,完成上述功能。
return OK;
}
int Push(Sqstack &s,int &e)
{//向栈输入元素
if(s.top-s.base>=s.stacksize)
{
s.base=(ElemType*)realloc(s.base,(s.stacksize+10)*sizeof(ElemType));
if(!s.base)return 0;
{int data; //存放顶点信息
struct ArcNode *firstarc; //指示第一个邻接点
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct
{ //图的结构定义
AdjList vertices; //顶点向量
int vexnum, arcnum;
(3)在求关键路径时,需要两次用到拓扑排序(其中一次是逆拓扑排序),在拓扑排序时还需要注意看看是否有环,若有环则输出提示信息。
㈣ 实验总结
通过对拓扑排序和求最小路径的操作,首先加强了对图的存储结构和图的遍历的进一步的熟悉和应用,在拓扑排序中还让我们去应用到以前学习的栈的知识,温故的同时也在实践的新的理论。
int Isquan;//是否含有权值
} MGraph;
int indegree[MAX_VERTEX_NUM];
int ve[MAX_VERTEX_NUM];//e各顶点的最早发生时间
int vl[MAX_VERTEX_NUM];//各顶点发生的最晚发生时间
/*图的邻接表存储(存储结构定义)的基本操作*/
对图的应用是在生活中应用很广泛,同时图的知识点和算法也是我们这学期学习的精华,例如求关键路径,用到栈,拓扑排序等经典算法,让我们受益匪浅。
四、主要算法流程图及程序清单
1、主要算法流程图:
创建图 拓扑排序
2、程序清单 程序过长,可附主要部分)
#include<string.h>
#include<malloc.h> /* malloc()等*/
int stacksize;
}Sqstack;
typedef int ElemType;
Status Initstack(Sqstack &s)
{s.base=(int*)malloc(sizeof(int)*25);
if (!s.base)
return ERROR;
s.top=s.base;
s.stacksize=25;
测试数据:教材图7.28
[题目二]:从键盘上输入AOE网的顶点和有向边的信息,建立其邻接表存储结构,输出其关键路径和关键路径长度。 试设计程序实现上述AOE网类型定义和基本操作,完成上述功能。
测试数据:教材图7.29
三、实验步骤
㈠、数据结构与核心算法的设计描述
基本数据结构:
#define TRUE 1
return i;
return -1;
};
Status CreateGraph(MGraph &G)
{int i,j,k;
InfoType vc;
VertexType va,vb;
ArcNode *p;
cout<<"请输入图的顶点数,边数: ";
cin>>G.vexnum>>G.arcnum;
cout<<"请输入"<<G.vexnum<<"个顶点的值(整数):\n";
int vl[MAX_VERTEX_NUM];//各顶点发生的最晚发生时间
调用的函数
Status Initstack(Sqstack &s)
Status Pop(Sqstack &s,int &e)
//若栈不空,则删除S的栈顶元素,
//用e返回其值,并返回OK;否则返回ERROR
int Push(Sqstack &s,int &e)
else
{s.top=s.base+s.stacksize;
s.stacksize+=10;
}
}
*s.top=e;
s.top++;
return OK;
p=p->nextarc;
}
}
//system("pause");
}
////////////////////////////////////////////////////////////////////
//
//建立栈相关的数据结构和函数//
typedef struct
{
int *top;
int *base;
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等*/
#define INFINITYINT_MAX //定义无穷大∞
#define MAX_VERTEX_NUM20
{
s.base=(int*)malloc(sizeof(int)*25);
if (!s.base)
return ERROR;
s.top=s.base;
s.stacksize=25;
return OK;
}
int indegree[MAX_VERTEX_NUM];
int ve[MAX_VERTEX_NUM];//e各顶点的最早发生时间
int LocateVex(MGraph G,VertexType u)
{
/初始条件:图G存在,u和G中顶点有相同特征*/
/*操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 */
int i;
for(i=0;i<G.vexnum;++i)
if(u==G.vertices[i].data)
}
㈢ 程序调试及运行结果分析
(1)在创建图的过程中需要考虑输入的方便,这就需要标记根据用户选择是否需要输入权值,选择不需要权值时就不会有关权值信息的操作。所以这就在图的结构体中加ISquan标记(0表示无权值,其他表示有权值)
(2)FindIndegree()函数调用过程就是一个对邻接表遍历的过程,在遍历过程中需要将弧指向的结点进行入度数组的标记。便定义了一个Indegree『』数组。
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等*/
#define INFINITYINT_MAX //定义无穷大∞
#define MAX_VERTEX_NUM20
typedef int VertexType;
typedef int InfoType;
cout<<"请顺序输入每条弧的弧尾 弧头"<<endl;
else
cout<<"请顺序输入每条弧的弧尾 弧头以及弧的信息(以空格作为间隔):\n";
for(k=0;k<G.arcnum;++k) /*构造表结点链表*/
{
if(!G.Isquan)
cin>>va>>vb;
else
cin>>va>>vb>>vc;
#include<limits.h> /* INT_MAX等*/
#include<iostream.h>
#include<process.h> /* exit() */