数据结构AOE关键路径,关于这个有些知识点需要涉及,一个是关于拓扑排序,一个是寻找关键路径。下面给出图例。 此次代码每一步相应给出了解释,因为部分算法书上是错误的。 关于拓扑排序就不用多说了,比较简单,下面给出一个AOE的关键路径求法。 当然答主关于图的很多算法有很多,这里就不再一一列出,但注意的是,可以点击此处查看最小生成树的求法与代码。
下面开始我们的数据结构题目 题目描述:按照图的“邻接表”存储结构表示AOE网,实现求其关键路径的算法,并验证如下图1所示AOE网的关键路径。
不过想说句题外话,西安电子科技大学出版的《数据结构》关于此处的算法有错误(要源于课本也要高于课本),我花了一些时间才看出猫腻来,我下面给出了完整的程序并且无错误。 操作提示:一个完整的系统应具有以下功能: 1)输入图的顶点数目. 2)按偏序顺序输入各边顶点及权值. 3)输入(0,0)结束(我这里采取了(0,0,0)的输入) 4)程序会自动计算出关键路径 下面附完整程序
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <stack>
using namespace std;
typedef struct ArcNode{
int adv;
struct ArcNode *nextArc;
int w;
}ArcNode;
typedef struct VNode{
ArcNode *first;
string datam;
}AdVlist;
typedef struct ALGraph{
AdVlist vts[500];
int v,e;
}ALGraph;
int Find(ALGraph &g,string x){
for(int i=0;i<g.v;i++){
if(x==g.vts[i].datam) return i;
}
return -1;
}
int ve[500];
stack<int> t;
void Creat(ALGraph &g){
int mw,edge=0;
string v1,v2;
cout<<"输入图的顶点数"<<endl;
cin>>g.v;
cout<<"输入图中结点信息"<<endl;
for(int i=0;i<g.v;i++){
cin>>g.vts[i].datam;
g.vts[i].first=NULL;
}
cout<<"输入图中两个顶点(起点和终点)与相应的权值,其中(0,0,0)结束"<<endl;
while(1){
cin>>v1>>v2>>mw;
if(v1=="0"&&v2=="0"&&mw==0) break;
edge++;
int j,k;
j=Find(g,v1);
k=Find(g,v2);
ArcNode *p1=new ArcNode;
p1->adv=k;
p1->w=mw;
p1->nextArc=NULL;
p1->nextArc=g.vts[j].first;
g.vts[j].first=p1;
}
g.e=edge;
}
void FindID(ALGraph g,int indegree[500]){
int i;
ArcNode *p;
for(i=0;i<g.v;i++) indegree[i]=0;
for(i=0;i<g.v;i++){
p=g.vts[i].first;
while(p!=NULL){
indegree[p->adv]++;
p=p->nextArc;
}
}
}
bool TopOrder(ALGraph g){
stack<int> s;
int count,i,j,k;
ArcNode *p;
int indegree[500];
FindID(g,indegree);
for(i=0;i<g.v;i++){
if(indegree[i]==0) s.push(i);
}
count=0;
for(i=0;i<g.v;i++){
ve[i]=0;
}
while(!s.empty()){
j=s.top();
s.pop();
t.push(j);
count++;
p=g.vts[j].first;
while(p!=NULL){
k=p->adv;
if(!(--indegree[k])) s.push(k);
if(ve[j]+p->w>ve[k]) ve[k]=ve[j]+p->w;
p=p->nextArc;
}
}
if(count<g.v) return false;
else return true;
}
bool CriticalPath(ALGraph g){
ArcNode *p;
int i,j,k,dut,ei,li;
int vl[500];
if(!TopOrder(g)) return false;
for(i=0;i<g.v;i++) vl[i]=ve[g.v-1];
while(!t.empty()){
j=t.top();
t.pop();
p=g.vts[j].first;
while(p!=NULL){
k=p->adv;
dut=p->w;
if(vl[k]-dut<vl[j]) vl[j]=vl[k]-dut;
p=p->nextArc;
}
}
cout<<"关键路径"<<endl;
cout<<"Initial "<<"End "<<"Weight "<<" el"<<" vl"<<endl;
for(j=0;j<g.v;j++){
p=g.vts[j].first;
while(p!=NULL){
k=p->adv;
dut=p->w;
ei=ve[j];
li=vl[k]-dut;
if(ei==li)
cout<<g.vts[j].datam<<" "<<g.vts[k].datam<<" "<<dut<<endl;
p=p->nextArc;
}
}
return true;
}
int main(){
ALGraph g;
Creat(g);
CriticalPath(g);
return 0;
}
下面给出此次程序的运行结果,图例按照上述题目要求的。
|