关键路径
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//找到待删结点 {
if(p == algraph.vertices[j].firstarc) //待删除结点为第一个邻接点
{ algraph.vertices[j].firstarc = p->nextarc; if(algraph.kind%2) //网 { delete p->info; } delete p; p = algraph.vertices[j].firstarc; if(algraph.kind<2) //有向 { algraph.arcnum--; }
图中删除弧<v,w>若是无向图,则还应删除对称弧<w,v>
bool (*VisitFunc)(T v);
//访问顶点 v 的方式
void DFS(int index); 递归的深度优先遍历图
//从第 index 个顶点出发
bool DFSTraverse(bool (*visit)(T v)); //图存在,对图进行深度优先 遍历
回 v 的第一个临接点的序号 若无领接点则返回空
int NextAdjVex(T v,T w);
//图存在,v 是图中某个顶点,w 是 v
的邻接点 返回 v 的相对于 w 的下一个邻接点的序号,若 w 是 v 的最后一个邻接
点则返回空
void InsertVex(T v);
//图存在 在图中增加新顶点 v
//顶点 v 后面的顶点前移 {
algraph.vertices[j] = algraph.vertices[j+1]; }
for(j = 0;j<algraph.vexnum;j++) //删除以 v 为入度的弧或边
{ p = algraph.vertices[j].firstarc; while(p) //有弧或边 { if(p->adjvex == i)
// 初始化顶点结点 {
cin>>algraph.vertices[i].data; algraph.vertices[i].firstarc = false; }
cout<<"请输入每条弧(边)的权值、弧尾、弧头: "<<endl;
//构造表结点链表 for(k = 0;k<algraph.arcnum;k++) {
return; algraph.vertices[i].data = value; }
template <class T> int ALGraph<T>::FirstAdjVex(T v) {
int i = LocateVex(v); ArcNode * p = algraph.vertices[i].firstarc;//p 指向下标为 i 的第一个 邻接点 if(p) {
int i; ArcNode *p,*q; for(i = 0;i<algraph.vexnum;i++)
//从顶点序号为 0 的顶点开始依次释放掉相应的邻接表 {
p = algraph.vertices[i].firstarc; while(p) {
q = p->nextarc; if(algraph.kind%2)
bool BFSTraverse(bool (*visit)(T v)); //图存在,对图进行广度优先 遍历
void DisPlay();
//输出图
void FindInDegree(int indegree[]); //求顶点的入度
bool TopologicalSort(); //若图无回路,则输出图的顶点的一个拓扑序列 并返回 true,否则返回 false
bool DeleteVex(T v); 关的弧
//图存在 删除顶点 v 及其相
bool InsertArc(T v,T w);
//图存在,V,w 是图的两个顶点 在
图中添加弧<v,w>若是无向图,则还应增加对称弧<w,v>
void DeleteArc(T v,T w);
//图存在,V,w 是图的两个顶点 在
} else {
q->nextarc = p->nextarc; if(algraph.kind%2)
//网 {
delete p->info; } delete p; p = q->nextarc; if(algraph.kind<2)
//有向 {
algraph.arcnum--; } } } else { if(p->adjvex>i) //修改表结点的顶点位置序号 { p->adjvex--; } q = p;
template <class T> struct _ALGraph{
VNode<T> vertices[MAX_VERTEX_NUM]; int vexnum;
int arcnum; int kind; };
#ifndef CSNODE #define CSNODE template <class T> struct CSTree{
while(p) //删除以 v 为出度的弧或边
{ q = p; p = p->nextarc; if(algraph.kind%2) //网 { delete q->info; } delete q; algraph.arcnum--;
} algraph.vexnum--; for(j = i;j<algraph.vexnum;j++)
返回该顶点在图中的位置
T GetVex(int index);
//图存在,index 是图中某个
顶点的序号 :返回 v 的值
void PutVex(T v,T value);
//图存在,v 是图中某个顶点 则对
v 赋值 value
int FirstAdjVex(T v);
//图存在,v 是 G 中某个顶点 返
bool TopologicalOrder(SeqStack<int> &T); // 求各顶点事件的最早发生 时间 ve
bool CriticalPath(); //输出图的各项关键活动 };
template <class T> int ALGraph<T>::LocateVex(T u) {
for(int i = 0;i<algraph.vexnum;i++) {
int ve[MAX_VERTEX_NUM];//各顶点最早发生时间
public:
void CreateGraph();
//v 是图的顶
点集 vr 是图的边集 //构造函数
void DestroyGraph();
//析构函数销
毁图
int LocateVex (T u);
//图存在,图中存在顶点 u 则
南通大学数据结构实践课
实验报告册
姓 名: 耿智 班 级: 软件工程 092 学 号: 0913063042 实验名称: 关键路径 指导老师: 丁卫平
南通大学杏林学院 2011 年 5 月 28 日
1.程序设计简介
本程序实现 AOE 网关键路径求解。图存储采用了邻接表。本程序 使用了顺序栈。程序提供有向网的创建和关键路径求解功能。运行结 果为:一条关键路径及辅助变量计算值,通过该值,很容易找到那些 活动为关键活动及关键路径的选择原则。
return p->adjvex; } else {
return -1; } }
template <class T> int ALGraph<T>::NextAdjVex(T v,T w) {
ArcNode *p; int i = LocateVex(v); int j = LocateVex(w); p = algraph.vertices[i].firstarc; while(p&&(p->adjvex!=j))
if(index<0||index>=algraph.vexnum) return false;
return algraph.vertices[index].data; }
template <class T> void ALGraph<T>::PutVex(T v,T value) {
int i = LocateVex(v); if(i<0) //该顶点不存在
p->info = new int; *(p->info) = w;
p->nextarc = algraph.vertices[i].firstarc; //插在表头 algraph.vertices[i].firstarc = p;
} }
template <class T> void ALGraph<T>::DestroyGraph() {
if(algraph.vexnum > MAX_VERTEX_NUM) return ;//无法插入
if(LocateVex(v)>=0) return;
algraph.vertices[algraph.vexnum].data = v; algraph.vertices[algraph.vexnum].firstarc = false; algraph.vexnum++; }
template <class T> bool ALGraph<T>::DeleteVex(T v) {
if(algraph.vexnum>=MAX_VERTEX_NUM) return false;
int i,j; ArcNode *p,*q; i = LocateVex(v); if(i<0)
return false; p = algraph.vertices[i].firstarc;
//网,则释放权值信息 {
delete p->info; } delete p;//删除弧结点 p = q; } } algraph.arcnum = 0; algraph.vexnum = 0; }
template <class T> T ALGraph<T>::GetVex(int index) {
if(algraph.vertices[i].data == u) {
return i; } }
return -1; }
template <class T> void ALGraph<T>::CreateGraph() {
int i,j,k; int w;//权值 T v1,v2;
cout<<"请输入图的顶点数,边数: "; cin>>algraph.vexnum>>algraph.arcnum; cout<<"请输入"<<algraph.vexnum<<"个顶点的值: "; for(i = 0;i<algraph.vexnum;i++)
2.算法设计
AdjLGraph.h #include "SqStack.h" #ifndef ALGRAPH #define ALGRAPH
#ifndef MAX_VERTEX_NUM #define MAX_VERTEX_NUM 20 //最大顶点数 #endif
struct ArcNode{
int adjvex;
cout<<"请输入一Байду номын сангаас弧(边)的权值、弧尾、弧头: "; cin>>w>>v1>>v2;
i = LocateVex(v1); j = LocateVex(v2); ArcNode *p = new ArcNode; //创建一个新的弧结点 p->adjvex = j; p->nextarc = false;
//树的二叉链表存储 T data; CSTree *firstchild; //孩子 CSTree *nextsibling;//兄弟 }; #endif
template <class T> class ALGraph{
_ALGraph<T> algraph;
bool visited[MAX_VERTEX_NUM];
//该弧所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条弧的指针
int *info;
//该弧相关信息的指针(权值)
};
template <class T> struct VNode{
T data; //顶点信息 ArcNode *firstarc;//指向第一条依附该顶点的指针 };
//让 p 指向顶点 w {
p = p->nextarc; } if(!p||!p->nextarc) //没找到 w 或 w 是最后一个顶点
return -1; else
//找到 w 且 w 不是最后一个顶点 {
return p->nextarc->adjvex; } }
template <class T> void ALGraph<T>::InsertVex(T v) {