有向无环图的关键路径
,,,,,,,,,?,,?,,.txt51,,,,,,,2,,,,,,,,,,,,,,,,,,,,,?,,Σ,,,,,,?,,,,,,,,#,,,,,,,,,,
,??,,?,,#include
#include
#include
using namespace std;
#define MAX_VERTEX_NUM 20
typedef struct ArcNode{
int adjvex; //,û,,,?,,?,,,,λ,,
struct ArcNode *nextarc; //?,,,,?,,,?,,
int info; //,,,,,,,?
//string info; //,û,,,,,,,}ArcNode;
typedef struct VNode{
int data; //,,,,,,,
ArcNode *firstarc; //?,,,?,,,8,,ö,,,?,,,?,,
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList vertices; //,,,
int venum,arcnum; //,,?,,,,,,,,,,,,
int kind; //,,,,,,,,?}ALGraph;
int InDegree[MAX_VERTEX_NUM]={0}; //,,,,,,,,,,,,int CreateUG(ALGraph& G){
cout<<",,,,,,,,ж,,,,,,,,,,:";
cin>>G.venum>>G.arcnum;
int i;
for( i=0; i>v1>>v2;
ArcNode* current=G.vertices[v1-1].firstarc;
ArcNode* p=G.vertices[v1-1].firstarc;
if(current==NULL){
G.vertices[v1-1].firstarc=new ArcNode;
G.vertices[v1-1].firstarc->adjvex=v2-1;
G.vertices[v1-1].firstarc->nextarc=NULL;
}
else{
while(current!=NULL){
p=current;
current=current->nextarc;
}
current=new ArcNode;
current->adjvex=v2-1;
current->nextarc=NULL;
p->nextarc=current;
}
current=G.vertices[v2-1].firstarc;
p=G.vertices[v2-1].firstarc;
if(current==NULL){
G.vertices[v2-1].firstarc=new ArcNode;
G.vertices[v2-1].firstarc->adjvex=v1-1;
G.vertices[v2-1].firstarc->nextarc=NULL;
}
else{
while(current!=NULL){
p=current;
current=current->nextarc;
}
current=new ArcNode;
current->adjvex=v1-1;
current->nextarc=NULL;
p->nextarc=current;
}
}
return 1;
}
int CreateDG(ALGraph& G){
cout<<",,,,,,,,ж,,,,,,,,,,:";cin>>G.venum>>G.arcnum;
int i;
for( i=0; i>v1>>v2>>info;
ArcNode* current=G.vertices[v1-1].firstarc;
ArcNode* p=G.vertices[v1-1].firstarc;
InDegree[v2-1]++;
if(current==NULL){
G.vertices[v1-1].firstarc=new ArcNode;
G.vertices[v1-1].firstarc->adjvex=v2-1;
G.vertices[v1-1].firstarc->nextarc=NULL;
G.vertices[v1-1].firstarc->info=info;
}
else{
while(current!=NULL){
p=current;
current=current->nextarc;
}
current=new ArcNode;
current->adjvex=v2-1;
current->nextarc=NULL;
current->info=info;
p->nextarc=current;
}
}
return 1;
}
int CreateDG1(ALGraph& G){
cout<<",,,,,,,,ж,,,,,,,,,,:";cin>>G.venum>>G.arcnum;
int i;
for( i=0; i>v1>>v2;
ArcNode* current=G.vertices[v2-1].firstarc;
ArcNode* p=G.vertices[v2-1].firstarc;
if(current==NULL){
G.vertices[v2-1].firstarc=new ArcNode;
G.vertices[v2-1].firstarc->adjvex=v1-1;
G.vertices[v2-1].firstarc->nextarc=NULL;
}
else{
while(current!=NULL){
p=current;
current=current->nextarc;
}
current=new ArcNode;
current->adjvex=v1-1;
current->nextarc=NULL;
p->nextarc=current;
}
}
return 1;
}
int CreateGraph(ALGraph& G){
cout<<",,,,,,,,,,,,,,?:";
cin>>G.kind;
switch(G.kind){
case 0:return CreateUG(G); //,,,,,,,,,
case 1:return CreateDG(G); //,,,,,,,,,
case 2:return CreateDG1(G); //,,,,,,,,,,
default:return 0;
}
}
int ve[MAX_VERTEX_NUM]={0};
bool TopologicalSort(ALGraph &G, stack &T){
stack S;
int i;
for( i=0; inextarc){
int w=p->adjvex;
InDegree[w]--;
if(InDegree[w]==0){
S.push(w);
}
if(ve[i]+p->info > ve[w])
ve[w]=ve[i]+p->info;
}
}
if(count T;
if(!TopologicalSort(G,T))
return ;
int v1[MAX_VERTEX_NUM];
for( k=0; knextarc){
k=p->adjvex;
dut=p->info;
if(v1[k]-dutnextarc){
k=q->adjvex;
dut=q->info;
if(ve[j]==v1[k]-dut){
cout<<",,,?,,:"<adjvex<<" ";
current1=current1->nextarc;
}
cout<nextarc;
delete current1;
current1=p;
}
}
}
return 1;
}