文章目录
前言
通过邻接表实现图的关键路径,包含是事件最早发生时间ve,事件最迟发生时间vl,活动最早开始时间ee,活动最晚开始时间el
一、图的构建
实现构造邻接表,测试(显示邻接表),拓扑排序,得到关键路径
const int MAX_VERTEX = 30;//图的最大顶点数
struct ArcNode//边表
{
int weight;//增加权值分量,代表活动时间
int adjvex;
ArcNode* next;
};
struct VertexNode//顶点表
{
int in;//增加入度
string vertex;
ArcNode* firstEdge;
};
class ALGraph//邻接表
{
private:
VertexNode* adjList;//创建顶点表
int vertexNum,arcNum;
int* ve, * vl;//ve数组是事件最早发生时间,vl数组是事件最迟发生时间
public:
ALGraph(string v[], int n, int e);//构造
~ALGraph();
void inputEdges();//输入图信息
bool setEdge(int vi, int vj, int weight);//插入边表,判断输入顶点及边
void displayDate();//显示图的信息
bool TopologicalSort(int result[], int& count);//拓扑排序 //result数组用来保存处理过的拓扑排序序列顶点;count用来保存处理过的拓扑排序顶点个数
bool CriticalPath();//求关键路径
};
二、邻接表构造函数
ALGraph::ALGraph(string v[], int n, int e)//初始化邻接表
{
vertexNum = n;
arcNum = e;
adjList = new VertexNode[vertexNum];
for (int i = 0; i < vertexNum; i++)
{
adjList[i].in = 0;//入度为0
adjList[i].vertex = v[i];
adjList[i].firstEdge = NULL;
}
ve = new int[vertexNum];
vl = new int[vertexNum];
}
void ALGraph::inputEdges()
{
cout << "请输入两个事件顶点编号范围0-" << vertexNum - 1 << ")和活动时间:" <&