第六章关键路径的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;