第六章关键路径的实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

韩山师范学院

实验题目:

关键路径算法实现

班级:2015级软工班作者:黄俊聪

#include

using namespace std;

#define MVNum 100//最大顶点数

#define OK 1

#define ERROR 0

typedefint Status;

typedef string VerTexType;

typedefintOtherInfo;

typedefstructArcNode//边结点

{

intadjvex;//该边所指向的顶点的位置

structArcNode* nextarc;//指向下一条边的指针

OtherInfo info;//和边相关的信息

int weight;

}ArcNode;

typedefstructVNode//顶点信息

{

VerTexType data;

ArcNode* firstarc;//指向第一条依附该顶点的边的指针

}VNode,AdjList[MVNum];//Adjlist表示邻接表类型

typedefstruct

{

AdjList vertices;

intvexnum,arcnum;//图的当前顶点数}ALGraph;

typedefstructStackNode

{

int data;

structStackNode* next;

}StackNode,*LinkStack;

Status InitStack(LinkStack& S)

{

S=NULL;

return OK;

}

Status Push(LinkStack&S,int e)

{

LinkStack p;

p=new StackNode;

p->data=e;

p->next=S;

S=p;

return OK;

}

Status Pop(LinkStack&S,int& e)

{

LinkStack p;

p=new StackNode;

if(S==NULL)

return ERROR;

e=S->data;

p=S;

S=S->next;

delete p;

return OK;

}

Status StackEmpty(LinkStack S)

{

if(S==NULL)

return OK;

else

return ERROR;

}

Status LocateVex(ALGraphG,string v)

{

int i;

for(int i=0;i

if(G.vertices[i].data==v)

return i;

return ERROR;

}

Status CreateUDG(ALGraph& G)

{

ArcNode* p1,*p2;

string v1,v2;

inti,j,w;

cout<<"输入总顶点数和总边数:"<

cin>>G.vexnum>>G.arcnum;//输入总顶点数和总边数

cout<<"输入各点,构造表头结点表:"<

for(int i=0;i

{

cin>>G.vertices[i].data;//输入顶点值

G.vertices[i].firstarc=NULL;//初始化表头结点的指针域为NULL

}

cout<<"输入各边和权值,构造邻接表:"<

for(int k=0;k

{

cin>>v1>>v2>>w;//输入一条边依附的两个顶点

i=LocateVex(G,v1);

j=LocateVex(G,v2);//确定v1和v2在G中的位置,即顶点在G.vertices中的序号

p1=new ArcNode;//生成一个新的边结点*p1

p1->adjvex=j;//邻接点序号为j

p1->weight=w;

p1->nextarc=G.vertices[i].firstarc;

G.vertices[i].firstarc=p1;//将新结点*p1插入顶点v1的边表头部

}

return OK;

}

Status FindInDegree(ALGraphG,intindegree[])

ArcNode* p;

for(int i=0;i

indegree[i]=0;

for(int i=0;i

for(p=G.vertices[i].firstarc;p!=NULL;p=p->nextarc)

indegree[p->adjvex]++;/*出度不为零,则该顶点firstarc域指向的弧指向的顶点入度加一*/

return OK;

}

Status TopologicalSort(ALGraphG,inttopo[])

{

LinkStack S;

ArcNode* p;

int i;

intindegree[G.vexnum];

FindInDegree(G,indegree);

InitStack(S);

for(i=0;i

if(!indegree[i])

Push(S,i);

int m=0;

string e;

while(!StackEmpty(S))

{

Pop(S,i);

topo[m]=i;

++m;

p=G.vertices[i].firstarc;

while(p!=NULL)

{

int k=p->adjvex;

--indegree[k];

if(indegree[k]==0)

Push(S,k);

p=p->nextarc;

}

}

if(m

return ERROR;

else

return OK;

相关文档
最新文档